From b621d7c2ff0a8fc06548eded4e3a27b8799a5e87 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Thu, 3 Mar 2016 12:19:19 +0100
Subject: [PATCH 01/17] [CHANGE] Require twig/twig,v1.24.0; Install in
vendor-dir with vendor-prefix (SensioLabsInsight - netzweberei / herbie #15:
The checker detected 1 security issues in package twig/twig installed in
version 1.16.3.0 )
---
plugins/twig/composer.json | 7 +-
plugins/twig/twig.php | 2 +-
plugins/twig/vendor/autoload.php | 7 +
plugins/twig/vendor/twig/twig/.editorconfig | 18 +
plugins/twig/vendor/twig/twig/.gitignore | 5 +
plugins/twig/vendor/twig/twig/.travis.yml | 39 +
plugins/twig/vendor/twig/twig/CHANGELOG | 828 ++++++++++++
plugins/twig/vendor/twig/twig/LICENSE | 31 +
plugins/twig/vendor/twig/twig/README.rst | 15 +
plugins/twig/vendor/twig/twig/composer.json | 46 +
.../twig/vendor/twig/twig/doc/advanced.rst | 872 +++++++++++++
.../vendor/twig/twig/doc/advanced_legacy.rst | 887 +++++++++++++
plugins/twig/vendor/twig/twig/doc/api.rst | 552 ++++++++
.../vendor/twig/twig/doc/coding_standards.rst | 101 ++
.../twig/vendor/twig/twig/doc/deprecated.rst | 162 +++
.../twig/vendor/twig/twig/doc/filters/abs.rst | 18 +
.../vendor/twig/twig/doc/filters/batch.rst | 51 +
.../twig/twig/doc/filters/capitalize.rst | 11 +
.../twig/doc/filters/convert_encoding.rst | 28 +
.../vendor/twig/twig/doc/filters/date.rst | 94 ++
.../twig/twig/doc/filters/date_modify.rst | 23 +
.../vendor/twig/twig/doc/filters/default.rst | 33 +
.../vendor/twig/twig/doc/filters/escape.rst | 116 ++
.../vendor/twig/twig/doc/filters/first.rst | 25 +
.../vendor/twig/twig/doc/filters/format.rst | 16 +
.../vendor/twig/twig/doc/filters/index.rst | 37 +
.../vendor/twig/twig/doc/filters/join.rst | 23 +
.../twig/twig/doc/filters/json_encode.rst | 21 +
.../vendor/twig/twig/doc/filters/keys.rst | 11 +
.../vendor/twig/twig/doc/filters/last.rst | 25 +
.../vendor/twig/twig/doc/filters/length.rst | 11 +
.../vendor/twig/twig/doc/filters/lower.rst | 10 +
.../vendor/twig/twig/doc/filters/merge.rst | 48 +
.../vendor/twig/twig/doc/filters/nl2br.rst | 22 +
.../twig/twig/doc/filters/number_format.rst | 45 +
.../twig/vendor/twig/twig/doc/filters/raw.rst | 36 +
.../vendor/twig/twig/doc/filters/replace.rst | 19 +
.../vendor/twig/twig/doc/filters/reverse.rst | 47 +
.../vendor/twig/twig/doc/filters/round.rst | 37 +
.../vendor/twig/twig/doc/filters/slice.rst | 71 ++
.../vendor/twig/twig/doc/filters/sort.rst | 18 +
.../vendor/twig/twig/doc/filters/split.rst | 53 +
.../twig/twig/doc/filters/striptags.rst | 15 +
.../vendor/twig/twig/doc/filters/title.rst | 11 +
.../vendor/twig/twig/doc/filters/trim.rst | 29 +
.../vendor/twig/twig/doc/filters/upper.rst | 10 +
.../twig/twig/doc/filters/url_encode.rst | 34 +
.../twig/twig/doc/functions/attribute.rst | 26 +
.../vendor/twig/twig/doc/functions/block.rst | 15 +
.../twig/twig/doc/functions/constant.rst | 18 +
.../vendor/twig/twig/doc/functions/cycle.rst | 28 +
.../vendor/twig/twig/doc/functions/date.rst | 52 +
.../vendor/twig/twig/doc/functions/dump.rst | 69 +
.../twig/twig/doc/functions/include.rst | 80 ++
.../vendor/twig/twig/doc/functions/index.rst | 20 +
.../vendor/twig/twig/doc/functions/max.rst | 20 +
.../vendor/twig/twig/doc/functions/min.rst | 20 +
.../vendor/twig/twig/doc/functions/parent.rst | 20 +
.../vendor/twig/twig/doc/functions/random.rst | 29 +
.../vendor/twig/twig/doc/functions/range.rst | 45 +
.../vendor/twig/twig/doc/functions/source.rst | 32 +
.../doc/functions/template_from_string.rst | 32 +
plugins/twig/vendor/twig/twig/doc/index.rst | 19 +
.../vendor/twig/twig/doc/installation.rst | 116 ++
.../twig/vendor/twig/twig/doc/internals.rst | 138 ++
plugins/twig/vendor/twig/twig/doc/intro.rst | 85 ++
plugins/twig/vendor/twig/twig/doc/recipes.rst | 518 ++++++++
.../vendor/twig/twig/doc/tags/autoescape.rst | 83 ++
.../twig/vendor/twig/twig/doc/tags/block.rst | 11 +
plugins/twig/vendor/twig/twig/doc/tags/do.rst | 12 +
.../twig/vendor/twig/twig/doc/tags/embed.rst | 178 +++
.../vendor/twig/twig/doc/tags/extends.rst | 268 ++++
.../twig/vendor/twig/twig/doc/tags/filter.rst | 21 +
.../twig/vendor/twig/twig/doc/tags/flush.rst | 17 +
.../twig/vendor/twig/twig/doc/tags/for.rst | 172 +++
.../twig/vendor/twig/twig/doc/tags/from.rst | 8 +
plugins/twig/vendor/twig/twig/doc/tags/if.rst | 76 ++
.../twig/vendor/twig/twig/doc/tags/import.rst | 57 +
.../vendor/twig/twig/doc/tags/include.rst | 86 ++
.../twig/vendor/twig/twig/doc/tags/index.rst | 24 +
.../twig/vendor/twig/twig/doc/tags/macro.rst | 86 ++
.../vendor/twig/twig/doc/tags/sandbox.rst | 30 +
.../twig/vendor/twig/twig/doc/tags/set.rst | 78 ++
.../vendor/twig/twig/doc/tags/spaceless.rst | 37 +
.../twig/vendor/twig/twig/doc/tags/use.rst | 124 ++
.../vendor/twig/twig/doc/tags/verbatim.rst | 24 +
.../twig/vendor/twig/twig/doc/templates.rst | 907 +++++++++++++
.../vendor/twig/twig/doc/tests/constant.rst | 22 +
.../vendor/twig/twig/doc/tests/defined.rst | 30 +
.../twig/twig/doc/tests/divisibleby.rst | 14 +
.../twig/vendor/twig/twig/doc/tests/empty.rst | 11 +
.../twig/vendor/twig/twig/doc/tests/even.rst | 10 +
.../twig/vendor/twig/twig/doc/tests/index.rst | 15 +
.../vendor/twig/twig/doc/tests/iterable.rst | 19 +
.../twig/vendor/twig/twig/doc/tests/null.rst | 12 +
.../twig/vendor/twig/twig/doc/tests/odd.rst | 10 +
.../vendor/twig/twig/doc/tests/sameas.rst | 14 +
.../twig/vendor/twig/twig/ext/twig/.gitignore | 30 +
.../twig/vendor/twig/twig/ext/twig/config.m4 | 8 +
.../twig/vendor/twig/twig/ext/twig/config.w32 | 8 +
.../twig/vendor/twig/twig/ext/twig/php_twig.h | 35 +
plugins/twig/vendor/twig/twig/ext/twig/twig.c | 1127 +++++++++++++++++
.../twig/{ => twig}/lib/Twig/Autoloader.php | 0
.../{ => twig}/lib/Twig/BaseNodeVisitor.php | 0
.../{ => twig}/lib/Twig/Cache/Filesystem.php | 0
.../twig/{ => twig}/lib/Twig/Cache/Null.php | 0
.../{ => twig}/lib/Twig/CacheInterface.php | 0
.../twig/{ => twig}/lib/Twig/Compiler.php | 0
.../{ => twig}/lib/Twig/CompilerInterface.php | 0
.../twig/{ => twig}/lib/Twig/Environment.php | 0
.../vendor/twig/{ => twig}/lib/Twig/Error.php | 0
.../twig/{ => twig}/lib/Twig/Error/Loader.php | 0
.../{ => twig}/lib/Twig/Error/Runtime.php | 0
.../twig/{ => twig}/lib/Twig/Error/Syntax.php | 0
.../lib/Twig/ExistsLoaderInterface.php | 0
.../{ => twig}/lib/Twig/ExpressionParser.php | 0
.../twig/{ => twig}/lib/Twig/Extension.php | 0
.../{ => twig}/lib/Twig/Extension/Core.php | 0
.../{ => twig}/lib/Twig/Extension/Debug.php | 0
.../{ => twig}/lib/Twig/Extension/Escaper.php | 0
.../lib/Twig/Extension/GlobalsInterface.php | 0
.../Twig/Extension/InitRuntimeInterface.php | 0
.../lib/Twig/Extension/Optimizer.php | 0
.../lib/Twig/Extension/Profiler.php | 0
.../{ => twig}/lib/Twig/Extension/Sandbox.php | 0
.../{ => twig}/lib/Twig/Extension/Staging.php | 0
.../lib/Twig/Extension/StringLoader.php | 0
.../lib/Twig/ExtensionInterface.php | 0
.../Twig/FileExtensionEscapingStrategy.php | 0
.../twig/{ => twig}/lib/Twig/Filter.php | 0
.../{ => twig}/lib/Twig/Filter/Function.php | 0
.../{ => twig}/lib/Twig/Filter/Method.php | 0
.../twig/{ => twig}/lib/Twig/Filter/Node.php | 0
.../lib/Twig/FilterCallableInterface.php | 0
.../{ => twig}/lib/Twig/FilterInterface.php | 0
.../twig/{ => twig}/lib/Twig/Function.php | 0
.../{ => twig}/lib/Twig/Function/Function.php | 0
.../{ => twig}/lib/Twig/Function/Method.php | 0
.../{ => twig}/lib/Twig/Function/Node.php | 0
.../lib/Twig/FunctionCallableInterface.php | 0
.../{ => twig}/lib/Twig/FunctionInterface.php | 0
.../vendor/twig/{ => twig}/lib/Twig/Lexer.php | 0
.../{ => twig}/lib/Twig/LexerInterface.php | 0
.../twig/{ => twig}/lib/Twig/Loader/Array.php | 0
.../twig/{ => twig}/lib/Twig/Loader/Chain.php | 0
.../{ => twig}/lib/Twig/Loader/Filesystem.php | 0
.../{ => twig}/lib/Twig/Loader/String.php | 0
.../{ => twig}/lib/Twig/LoaderInterface.php | 0
.../twig/{ => twig}/lib/Twig/Markup.php | 0
.../vendor/twig/{ => twig}/lib/Twig/Node.php | 0
.../{ => twig}/lib/Twig/Node/AutoEscape.php | 0
.../twig/{ => twig}/lib/Twig/Node/Block.php | 0
.../lib/Twig/Node/BlockReference.php | 0
.../twig/{ => twig}/lib/Twig/Node/Body.php | 0
.../lib/Twig/Node/CheckSecurity.php | 0
.../twig/{ => twig}/lib/Twig/Node/Do.php | 0
.../twig/{ => twig}/lib/Twig/Node/Embed.php | 0
.../{ => twig}/lib/Twig/Node/Expression.php | 0
.../lib/Twig/Node/Expression/Array.php | 0
.../lib/Twig/Node/Expression/AssignName.php | 0
.../lib/Twig/Node/Expression/Binary.php | 0
.../lib/Twig/Node/Expression/Binary/Add.php | 0
.../lib/Twig/Node/Expression/Binary/And.php | 0
.../Node/Expression/Binary/BitwiseAnd.php | 0
.../Twig/Node/Expression/Binary/BitwiseOr.php | 0
.../Node/Expression/Binary/BitwiseXor.php | 0
.../Twig/Node/Expression/Binary/Concat.php | 0
.../lib/Twig/Node/Expression/Binary/Div.php | 0
.../Twig/Node/Expression/Binary/EndsWith.php | 0
.../lib/Twig/Node/Expression/Binary/Equal.php | 0
.../Twig/Node/Expression/Binary/FloorDiv.php | 0
.../Twig/Node/Expression/Binary/Greater.php | 0
.../Node/Expression/Binary/GreaterEqual.php | 0
.../lib/Twig/Node/Expression/Binary/In.php | 0
.../lib/Twig/Node/Expression/Binary/Less.php | 0
.../Twig/Node/Expression/Binary/LessEqual.php | 0
.../Twig/Node/Expression/Binary/Matches.php | 0
.../lib/Twig/Node/Expression/Binary/Mod.php | 0
.../lib/Twig/Node/Expression/Binary/Mul.php | 0
.../Twig/Node/Expression/Binary/NotEqual.php | 0
.../lib/Twig/Node/Expression/Binary/NotIn.php | 0
.../lib/Twig/Node/Expression/Binary/Or.php | 0
.../lib/Twig/Node/Expression/Binary/Power.php | 0
.../lib/Twig/Node/Expression/Binary/Range.php | 0
.../Node/Expression/Binary/StartsWith.php | 0
.../lib/Twig/Node/Expression/Binary/Sub.php | 0
.../Twig/Node/Expression/BlockReference.php | 0
.../lib/Twig/Node/Expression/Call.php | 0
.../lib/Twig/Node/Expression/Conditional.php | 0
.../lib/Twig/Node/Expression/Constant.php | 0
.../Node/Expression/ExtensionReference.php | 0
.../lib/Twig/Node/Expression/Filter.php | 0
.../Twig/Node/Expression/Filter/Default.php | 0
.../lib/Twig/Node/Expression/Function.php | 0
.../lib/Twig/Node/Expression/GetAttr.php | 0
.../lib/Twig/Node/Expression/MethodCall.php | 0
.../lib/Twig/Node/Expression/Name.php | 0
.../lib/Twig/Node/Expression/NullCoalesce.php | 0
.../lib/Twig/Node/Expression/Parent.php | 0
.../lib/Twig/Node/Expression/TempName.php | 0
.../lib/Twig/Node/Expression/Test.php | 0
.../Twig/Node/Expression/Test/Constant.php | 0
.../lib/Twig/Node/Expression/Test/Defined.php | 0
.../Twig/Node/Expression/Test/Divisibleby.php | 0
.../lib/Twig/Node/Expression/Test/Even.php | 0
.../lib/Twig/Node/Expression/Test/Null.php | 0
.../lib/Twig/Node/Expression/Test/Odd.php | 0
.../lib/Twig/Node/Expression/Test/Sameas.php | 0
.../lib/Twig/Node/Expression/Unary.php | 0
.../lib/Twig/Node/Expression/Unary/Neg.php | 0
.../lib/Twig/Node/Expression/Unary/Not.php | 0
.../lib/Twig/Node/Expression/Unary/Pos.php | 0
.../twig/{ => twig}/lib/Twig/Node/Flush.php | 0
.../twig/{ => twig}/lib/Twig/Node/For.php | 0
.../twig/{ => twig}/lib/Twig/Node/ForLoop.php | 0
.../twig/{ => twig}/lib/Twig/Node/If.php | 0
.../twig/{ => twig}/lib/Twig/Node/Import.php | 0
.../twig/{ => twig}/lib/Twig/Node/Include.php | 0
.../twig/{ => twig}/lib/Twig/Node/Macro.php | 0
.../twig/{ => twig}/lib/Twig/Node/Module.php | 0
.../twig/{ => twig}/lib/Twig/Node/Print.php | 0
.../twig/{ => twig}/lib/Twig/Node/Sandbox.php | 0
.../lib/Twig/Node/SandboxedPrint.php | 0
.../twig/{ => twig}/lib/Twig/Node/Set.php | 0
.../twig/{ => twig}/lib/Twig/Node/SetTemp.php | 0
.../{ => twig}/lib/Twig/Node/Spaceless.php | 0
.../twig/{ => twig}/lib/Twig/Node/Text.php | 0
.../{ => twig}/lib/Twig/NodeInterface.php | 0
.../lib/Twig/NodeOutputInterface.php | 0
.../{ => twig}/lib/Twig/NodeTraverser.php | 0
.../lib/Twig/NodeVisitor/Escaper.php | 0
.../lib/Twig/NodeVisitor/Optimizer.php | 0
.../lib/Twig/NodeVisitor/SafeAnalysis.php | 0
.../lib/Twig/NodeVisitor/Sandbox.php | 0
.../lib/Twig/NodeVisitorInterface.php | 0
.../twig/{ => twig}/lib/Twig/Parser.php | 0
.../{ => twig}/lib/Twig/ParserInterface.php | 0
.../lib/Twig/Profiler/Dumper/Blackfire.php | 0
.../lib/Twig/Profiler/Dumper/Html.php | 0
.../lib/Twig/Profiler/Dumper/Text.php | 0
.../lib/Twig/Profiler/Node/EnterProfile.php | 0
.../lib/Twig/Profiler/Node/LeaveProfile.php | 0
.../Twig/Profiler/NodeVisitor/Profiler.php | 0
.../{ => twig}/lib/Twig/Profiler/Profile.php | 0
.../lib/Twig/Sandbox/SecurityError.php | 0
.../Sandbox/SecurityNotAllowedFilterError.php | 0
.../SecurityNotAllowedFunctionError.php | 0
.../Sandbox/SecurityNotAllowedTagError.php | 0
.../lib/Twig/Sandbox/SecurityPolicy.php | 0
.../Twig/Sandbox/SecurityPolicyInterface.php | 0
.../twig/{ => twig}/lib/Twig/SimpleFilter.php | 0
.../{ => twig}/lib/Twig/SimpleFunction.php | 0
.../twig/{ => twig}/lib/Twig/SimpleTest.php | 0
.../twig/{ => twig}/lib/Twig/Template.php | 0
.../{ => twig}/lib/Twig/TemplateInterface.php | 0
.../vendor/twig/{ => twig}/lib/Twig/Test.php | 0
.../{ => twig}/lib/Twig/Test/Function.php | 0
.../lib/Twig/Test/IntegrationTestCase.php | 0
.../twig/{ => twig}/lib/Twig/Test/Method.php | 0
.../twig/{ => twig}/lib/Twig/Test/Node.php | 0
.../{ => twig}/lib/Twig/Test/NodeTestCase.php | 0
.../lib/Twig/TestCallableInterface.php | 0
.../{ => twig}/lib/Twig/TestInterface.php | 0
.../vendor/twig/{ => twig}/lib/Twig/Token.php | 0
.../twig/{ => twig}/lib/Twig/TokenParser.php | 0
.../lib/Twig/TokenParser/AutoEscape.php | 0
.../{ => twig}/lib/Twig/TokenParser/Block.php | 0
.../{ => twig}/lib/Twig/TokenParser/Do.php | 0
.../{ => twig}/lib/Twig/TokenParser/Embed.php | 0
.../lib/Twig/TokenParser/Extends.php | 0
.../lib/Twig/TokenParser/Filter.php | 0
.../{ => twig}/lib/Twig/TokenParser/Flush.php | 0
.../{ => twig}/lib/Twig/TokenParser/For.php | 0
.../{ => twig}/lib/Twig/TokenParser/From.php | 0
.../{ => twig}/lib/Twig/TokenParser/If.php | 0
.../lib/Twig/TokenParser/Import.php | 0
.../lib/Twig/TokenParser/Include.php | 0
.../{ => twig}/lib/Twig/TokenParser/Macro.php | 0
.../lib/Twig/TokenParser/Sandbox.php | 0
.../{ => twig}/lib/Twig/TokenParser/Set.php | 0
.../lib/Twig/TokenParser/Spaceless.php | 0
.../{ => twig}/lib/Twig/TokenParser/Use.php | 0
.../{ => twig}/lib/Twig/TokenParserBroker.php | 0
.../lib/Twig/TokenParserBrokerInterface.php | 0
.../lib/Twig/TokenParserInterface.php | 0
.../twig/{ => twig}/lib/Twig/TokenStream.php | 0
.../lib/Twig/Util/DeprecationCollector.php | 0
.../lib/Twig/Util/TemplateDirIterator.php | 0
.../twig/vendor/twig/twig/phpunit.xml.dist | 25 +
.../twig/test/Twig/Tests/AutoloaderTest.php | 24 +
.../test/Twig/Tests/Cache/FilesystemTest.php | 193 +++
.../twig/test/Twig/Tests/CompilerTest.php | 33 +
.../twig/test/Twig/Tests/EnvironmentTest.php | 529 ++++++++
.../twig/twig/test/Twig/Tests/ErrorTest.php | 144 +++
.../test/Twig/Tests/ExpressionParserTest.php | 368 ++++++
.../test/Twig/Tests/Extension/CoreTest.php | 158 +++
.../test/Twig/Tests/Extension/SandboxTest.php | 220 ++++
.../twig/test/Twig/Tests/FileCachingTest.php | 63 +
.../FileExtensionEscapingStrategyTest.php | 51 +
.../twig/test/Twig/Tests/FilesystemHelper.php | 30 +
.../Tests/Fixtures/autoescape/filename.test | 18 +
.../test/Twig/Tests/Fixtures/errors/base.html | 1 +
.../Twig/Tests/Fixtures/errors/index.html | 7 +
...ltiline_array_with_undefined_variable.test | 18 +
...e_array_with_undefined_variable_again.test | 18 +
...line_function_with_undefined_variable.test | 12 +
...tiline_function_with_unknown_argument.test | 9 +
...multiline_tag_with_undefined_variable.test | 12 +
.../syntax_error_in_reused_template.test | 10 +
.../Fixtures/exceptions/unclosed_tag.test | 20 +
.../Fixtures/exceptions/undefined_parent.test | 8 +
.../undefined_template_in_child_template.test | 15 +
.../Fixtures/exceptions/undefined_trait.test | 9 +
.../Tests/Fixtures/expressions/array.test | 61 +
.../Fixtures/expressions/array_call.test | 14 +
.../Tests/Fixtures/expressions/binary.test | 46 +
.../Tests/Fixtures/expressions/bitwise.test | 14 +
.../Fixtures/expressions/comparison.test | 14 +
.../Fixtures/expressions/divisibleby.test | 17 +
.../Tests/Fixtures/expressions/dotdot.test | 20 +
.../Tests/Fixtures/expressions/ends_with.test | 26 +
.../Tests/Fixtures/expressions/grouping.test | 8 +
.../Tests/Fixtures/expressions/literals.test | 22 +
.../Fixtures/expressions/magic_call.test | 27 +
.../Tests/Fixtures/expressions/matches.test | 12 +
.../Fixtures/expressions/method_call.test | 28 +
.../expressions/negative_numbers.test | 18 +
.../expressions/operators_as_variables.test | 16 +
.../Tests/Fixtures/expressions/postfix.test | 22 +
.../Tests/Fixtures/expressions/sameas.test | 21 +
.../Fixtures/expressions/starts_with.test | 27 +
.../Tests/Fixtures/expressions/strings.test | 10 +
.../expressions/ternary_operator.test | 18 +
.../expressions/ternary_operator_noelse.test | 10 +
.../expressions/ternary_operator_nothen.test | 10 +
.../two_word_operators_as_variables.test | 8 +
.../Tests/Fixtures/expressions/unary.test | 12 +
.../expressions/unary_macro_arguments.test | 22 +
.../expressions/unary_precedence.test | 14 +
.../test/Twig/Tests/Fixtures/filters/abs.test | 30 +
.../Twig/Tests/Fixtures/filters/batch.test | 31 +
.../Tests/Fixtures/filters/batch_float.test | 29 +
.../filters/batch_with_empty_fill.test | 37 +
.../filters/batch_with_exact_elements.test | 33 +
.../Fixtures/filters/batch_with_fill.test | 37 +
.../Fixtures/filters/batch_with_keys.test | 10 +
.../filters/batch_with_zero_elements.test | 10 +
.../Fixtures/filters/convert_encoding.test | 10 +
.../Twig/Tests/Fixtures/filters/date.test | 90 ++
.../Fixtures/filters/date_default_format.test | 14 +
.../filters/date_default_format_interval.test | 16 +
.../Fixtures/filters/date_immutable.test | 37 +
.../Tests/Fixtures/filters/date_interval.test | 19 +
.../Tests/Fixtures/filters/date_modify.test | 14 +
.../Fixtures/filters/date_namedargs.test | 13 +
.../Twig/Tests/Fixtures/filters/default.test | 150 +++
.../Fixtures/filters/dynamic_filter.test | 10 +
.../Twig/Tests/Fixtures/filters/escape.test | 8 +
.../Fixtures/filters/escape_html_attr.test | 8 +
.../filters/escape_non_supported_charset.test | 8 +
.../Twig/Tests/Fixtures/filters/first.test | 17 +
.../Tests/Fixtures/filters/force_escape.test | 18 +
.../Twig/Tests/Fixtures/filters/format.test | 8 +
.../Twig/Tests/Fixtures/filters/join.test | 12 +
.../Tests/Fixtures/filters/json_encode.test | 12 +
.../Twig/Tests/Fixtures/filters/last.test | 17 +
.../Twig/Tests/Fixtures/filters/length.test | 14 +
.../Tests/Fixtures/filters/length_utf8.test | 12 +
.../Twig/Tests/Fixtures/filters/merge.test | 18 +
.../Twig/Tests/Fixtures/filters/nl2br.test | 14 +
.../Tests/Fixtures/filters/number_format.test | 18 +
.../filters/number_format_default.test | 21 +
.../Twig/Tests/Fixtures/filters/replace.test | 12 +
.../Fixtures/filters/replace_invalid_arg.test | 8 +
.../Twig/Tests/Fixtures/filters/reverse.test | 18 +
.../Twig/Tests/Fixtures/filters/round.test | 22 +
.../Twig/Tests/Fixtures/filters/slice.test | 54 +
.../Twig/Tests/Fixtures/filters/sort.test | 12 +
.../Tests/Fixtures/filters/special_chars.test | 8 +
.../Twig/Tests/Fixtures/filters/split.test | 20 +
.../Tests/Fixtures/filters/split_utf8.test | 24 +
.../Twig/Tests/Fixtures/filters/trim.test | 12 +
.../Tests/Fixtures/filters/urlencode.test | 16 +
.../filters/urlencode_deprecated.test | 16 +
.../Tests/Fixtures/functions/attribute.test | 18 +
.../Twig/Tests/Fixtures/functions/block.test | 12 +
.../Tests/Fixtures/functions/constant.test | 10 +
.../Twig/Tests/Fixtures/functions/cycle.test | 16 +
.../Twig/Tests/Fixtures/functions/date.test | 25 +
.../Fixtures/functions/date_namedargs.test | 11 +
.../Twig/Tests/Fixtures/functions/dump.test | 16 +
.../Tests/Fixtures/functions/dump_array.test | 19 +
.../Fixtures/functions/dynamic_function.test | 10 +
.../functions/include/assignment.test | 13 +
.../functions/include/autoescaping.test | 10 +
.../Fixtures/functions/include/basic.test | 17 +
.../functions/include/expression.test | 17 +
.../functions/include/ignore_missing.test | 10 +
.../Fixtures/functions/include/missing.test | 8 +
.../functions/include/missing_nested.test | 16 +
.../Fixtures/functions/include/sandbox.test | 13 +
.../functions/include/sandbox_disabling.test | 16 +
.../sandbox_disabling_ignore_missing.test | 13 +
.../functions/include/template_instance.test | 10 +
.../functions/include/templates_as_array.test | 12 +
.../functions/include/with_context.test | 16 +
.../functions/include/with_variables.test | 12 +
.../Twig/Tests/Fixtures/functions/max.test | 12 +
.../Twig/Tests/Fixtures/functions/min.test | 12 +
.../Twig/Tests/Fixtures/functions/range.test | 8 +
.../recursive_block_with_inheritance.test | 21 +
.../Twig/Tests/Fixtures/functions/source.test | 17 +
.../Fixtures/functions/special_chars.test | 8 +
.../functions/template_from_string.test | 15 +
.../Tests/Fixtures/macros/default_values.test | 16 +
.../Tests/Fixtures/macros/nested_calls.test | 18 +
.../Fixtures/macros/reserved_variables.test | 14 +
.../Twig/Tests/Fixtures/macros/simple.test | 22 +
.../Twig/Tests/Fixtures/macros/varargs.test | 21 +
.../Fixtures/macros/varargs_argument.test | 8 +
.../Tests/Fixtures/macros/with_filters.test | 14 +
.../regression/combined_debug_info.test | 15 +
.../Fixtures/regression/empty_token.test | 8 +
.../Tests/Fixtures/regression/issue_1143.test | 23 +
.../Fixtures/regression/multi_word_tests.test | 10 +
.../regression/simple_xml_element.test | 19 +
.../regression/strings_like_numbers.test | 8 +
.../Tests/Fixtures/tags/autoescape/basic.test | 26 +
.../Fixtures/tags/autoescape/blocks.test | 12 +
.../tags/autoescape/double_escaping.test | 10 +
.../Fixtures/tags/autoescape/functions.test | 83 ++
.../Fixtures/tags/autoescape/literal.test | 45 +
.../Fixtures/tags/autoescape/nested.test | 26 +
.../Fixtures/tags/autoescape/objects.test | 26 +
.../Tests/Fixtures/tags/autoescape/raw.test | 10 +
.../tags/autoescape/strategy.legacy.test | 11 +
.../Fixtures/tags/autoescape/strategy.test | 11 +
.../Tests/Fixtures/tags/autoescape/type.test | 69 +
.../tags/autoescape/with_filters.test | 131 ++
.../autoescape/with_filters_arguments.test | 23 +
.../autoescape/with_pre_escape_filters.test | 68 +
.../with_preserves_safety_filters.test | 50 +
.../Twig/Tests/Fixtures/tags/block/basic.test | 11 +
.../tags/block/block_unique_name.test | 11 +
.../Fixtures/tags/block/special_chars.test | 10 +
.../Twig/Tests/Fixtures/tags/embed/basic.test | 35 +
.../Tests/Fixtures/tags/embed/error_line.test | 16 +
.../Tests/Fixtures/tags/embed/multiple.test | 50 +
.../Tests/Fixtures/tags/embed/nested.test | 42 +
.../Fixtures/tags/embed/with_extends.test | 60 +
.../Tests/Fixtures/tags/filter/basic.test | 10 +
.../Fixtures/tags/filter/json_encode.test | 8 +
.../Tests/Fixtures/tags/filter/multiple.test | 10 +
.../Tests/Fixtures/tags/filter/nested.test | 16 +
.../Fixtures/tags/filter/with_for_tag.test | 13 +
.../Fixtures/tags/filter/with_if_tag.test | 29 +
.../Tests/Fixtures/tags/for/condition.test | 14 +
.../Twig/Tests/Fixtures/tags/for/context.test | 18 +
.../Twig/Tests/Fixtures/tags/for/else.test | 23 +
.../Fixtures/tags/for/inner_variables.test | 17 +
.../Twig/Tests/Fixtures/tags/for/keys.test | 11 +
.../Fixtures/tags/for/keys_and_values.test | 11 +
.../Tests/Fixtures/tags/for/loop_context.test | 19 +
.../Fixtures/tags/for/loop_context_local.test | 10 +
.../Fixtures/tags/for/loop_not_defined.test | 10 +
.../tags/for/loop_not_defined_cond.test | 9 +
.../Tests/Fixtures/tags/for/nested_else.test | 17 +
.../Twig/Tests/Fixtures/tags/for/objects.test | 43 +
.../Fixtures/tags/for/objects_countable.test | 47 +
.../Tests/Fixtures/tags/for/recursive.test | 18 +
.../Twig/Tests/Fixtures/tags/for/values.test | 11 +
.../test/Twig/Tests/Fixtures/tags/from.test | 14 +
.../Twig/Tests/Fixtures/tags/if/basic.test | 22 +
.../Tests/Fixtures/tags/if/expression.test | 22 +
.../Tests/Fixtures/tags/include/basic.test | 16 +
.../Fixtures/tags/include/expression.test | 16 +
.../Fixtures/tags/include/ignore_missing.test | 10 +
.../Tests/Fixtures/tags/include/missing.test | 8 +
.../Fixtures/tags/include/missing_nested.test | 16 +
.../Tests/Fixtures/tags/include/only.test | 16 +
.../tags/include/template_instance.test | 10 +
.../tags/include/templates_as_array.test | 12 +
.../Fixtures/tags/include/with_variables.test | 12 +
.../Fixtures/tags/inheritance/basic.test | 14 +
.../Fixtures/tags/inheritance/block_expr.test | 32 +
.../tags/inheritance/block_expr2.test | 34 +
.../tags/inheritance/conditional.test | 14 +
.../Fixtures/tags/inheritance/dynamic.test | 14 +
.../Fixtures/tags/inheritance/empty.test | 10 +
.../tags/inheritance/extends_as_array.test | 12 +
.../extends_as_array_with_empty_name.test | 12 +
.../extends_as_array_with_null_name.test | 12 +
.../Fixtures/tags/inheritance/multiple.test | 12 +
.../tags/inheritance/multiple_dynamic.test | 22 +
.../tags/inheritance/nested_blocks.test | 22 +
.../nested_blocks_parent_only.test | 15 +
.../tags/inheritance/nested_inheritance.test | 16 +
.../Fixtures/tags/inheritance/parent.test | 12 +
.../tags/inheritance/parent_change.test | 16 +
.../tags/inheritance/parent_in_a_block.test | 8 +
.../tags/inheritance/parent_isolation.test | 20 +
.../tags/inheritance/parent_nested.test | 28 +
.../inheritance/parent_without_extends.test | 8 +
.../parent_without_extends_but_traits.test | 14 +
.../tags/inheritance/template_instance.test | 14 +
.../Tests/Fixtures/tags/inheritance/use.test | 44 +
.../Twig/Tests/Fixtures/tags/macro/basic.test | 17 +
.../Fixtures/tags/macro/endmacro_name.test | 16 +
.../Tests/Fixtures/tags/macro/external.test | 17 +
.../Twig/Tests/Fixtures/tags/macro/from.test | 18 +
.../tags/macro/from_with_reserved_name.test | 9 +
.../Tests/Fixtures/tags/macro/global.test | 14 +
.../tags/macro/import_with_reserved_nam.test | 11 +
.../Fixtures/tags/macro/reserved_name.test | 10 +
.../Fixtures/tags/macro/self_import.test | 17 +
.../Fixtures/tags/macro/special_chars.test | 14 +
.../Fixtures/tags/macro/super_globals.test | 14 +
.../Tests/Fixtures/tags/raw/basic.legacy.test | 10 +
.../tags/raw/mixed_usage_with_raw.legacy.test | 10 +
.../tags/raw/whitespace_control.legacy.test | 56 +
.../Fixtures/tags/sandbox/not_valid1.test | 11 +
.../Fixtures/tags/sandbox/not_valid2.test | 14 +
.../Tests/Fixtures/tags/sandbox/simple.test | 22 +
.../Twig/Tests/Fixtures/tags/set/basic.test | 20 +
.../Fixtures/tags/set/capture-empty.test | 9 +
.../Twig/Tests/Fixtures/tags/set/capture.test | 10 +
.../Tests/Fixtures/tags/set/expression.test | 12 +
.../Tests/Fixtures/tags/spaceless/simple.test | 12 +
.../Tests/Fixtures/tags/special_chars.test | 8 +
.../Twig/Tests/Fixtures/tags/trim_block.test | 74 ++
.../Twig/Tests/Fixtures/tags/use/aliases.test | 12 +
.../Twig/Tests/Fixtures/tags/use/basic.test | 12 +
.../Twig/Tests/Fixtures/tags/use/deep.test | 22 +
.../Tests/Fixtures/tags/use/deep_empty.test | 10 +
.../Tests/Fixtures/tags/use/inheritance.test | 25 +
.../Tests/Fixtures/tags/use/inheritance2.test | 24 +
.../Tests/Fixtures/tags/use/multiple.test | 21 +
.../Fixtures/tags/use/multiple_aliases.test | 23 +
.../Tests/Fixtures/tags/use/parent_block.test | 24 +
.../Fixtures/tags/use/parent_block2.test | 24 +
.../Fixtures/tags/use/parent_block3.test | 38 +
.../Tests/Fixtures/tags/verbatim/basic.test | 10 +
.../tags/verbatim/mixed_usage_with_raw.test | 10 +
.../tags/verbatim/whitespace_control.test | 56 +
.../test/Twig/Tests/Fixtures/tests/array.test | 24 +
.../Twig/Tests/Fixtures/tests/constant.test | 14 +
.../Twig/Tests/Fixtures/tests/defined.test | 129 ++
.../test/Twig/Tests/Fixtures/tests/empty.test | 45 +
.../test/Twig/Tests/Fixtures/tests/even.test | 14 +
.../test/Twig/Tests/Fixtures/tests/in.test | 128 ++
.../Tests/Fixtures/tests/in_with_objects.test | 19 +
.../Twig/Tests/Fixtures/tests/iterable.test | 19 +
.../Tests/Fixtures/tests/null_coalesce.test | 30 +
.../test/Twig/Tests/Fixtures/tests/odd.test | 10 +
.../twig/test/Twig/Tests/IntegrationTest.php | 229 ++++
.../Tests/LegacyFixtures/test.legacy.test | 8 +
.../test/Twig/Tests/LegacyIntegrationTest.php | 54 +
.../twig/twig/test/Twig/Tests/LexerTest.php | 300 +++++
.../twig/test/Twig/Tests/Loader/ArrayTest.php | 97 ++
.../twig/test/Twig/Tests/Loader/ChainTest.php | 79 ++
.../test/Twig/Tests/Loader/FilesystemTest.php | 175 +++
.../array_inheritance_empty_parent.html.twig | 3 +
...y_inheritance_nonexistent_parent.html.twig | 3 +
.../array_inheritance_null_parent.html.twig | 3 +
.../array_inheritance_valid_parent.html.twig | 3 +
.../Fixtures/inheritance/parent.html.twig | 1 +
.../inheritance/spare_parent.html.twig | 1 +
.../Tests/Loader/Fixtures/named/index.html | 1 +
.../Loader/Fixtures/named_bis/index.html | 1 +
.../Loader/Fixtures/named_final/index.html | 1 +
.../Fixtures/named_quater/named_absolute.html | 1 +
.../Loader/Fixtures/named_ter/index.html | 1 +
.../Tests/Loader/Fixtures/normal/index.html | 1 +
.../Loader/Fixtures/normal_bis/index.html | 1 +
.../Loader/Fixtures/normal_final/index.html | 1 +
.../Loader/Fixtures/normal_ter/index.html | 1 +
.../Fixtures/themes/theme1/blocks.html.twig | 3 +
.../Fixtures/themes/theme2/blocks.html.twig | 3 +
.../test/Twig/Tests/NativeExtensionTest.php | 33 +
.../test/Twig/Tests/Node/AutoEscapeTest.php | 32 +
.../Twig/Tests/Node/BlockReferenceTest.php | 31 +
.../twig/test/Twig/Tests/Node/BlockTest.php | 39 +
.../twig/twig/test/Twig/Tests/Node/DoTest.php | 32 +
.../Twig/Tests/Node/Expression/ArrayTest.php | 37 +
.../Tests/Node/Expression/AssignNameTest.php | 29 +
.../Tests/Node/Expression/Binary/AddTest.php | 34 +
.../Tests/Node/Expression/Binary/AndTest.php | 34 +
.../Node/Expression/Binary/ConcatTest.php | 34 +
.../Tests/Node/Expression/Binary/DivTest.php | 34 +
.../Node/Expression/Binary/FloorDivTest.php | 34 +
.../Tests/Node/Expression/Binary/ModTest.php | 34 +
.../Tests/Node/Expression/Binary/MulTest.php | 34 +
.../Tests/Node/Expression/Binary/OrTest.php | 34 +
.../Tests/Node/Expression/Binary/SubTest.php | 34 +
.../Twig/Tests/Node/Expression/CallTest.php | 116 ++
.../Tests/Node/Expression/ConditionalTest.php | 38 +
.../Tests/Node/Expression/ConstantTest.php | 30 +
.../Twig/Tests/Node/Expression/FilterTest.php | 154 +++
.../Tests/Node/Expression/FunctionTest.php | 110 ++
.../Tests/Node/Expression/GetAttrTest.php | 50 +
.../Twig/Tests/Node/Expression/NameTest.php | 35 +
.../Node/Expression/PHP53/FilterInclude.php | 6 +
.../Node/Expression/PHP53/FunctionInclude.php | 6 +
.../Node/Expression/PHP53/TestInclude.php | 6 +
.../Twig/Tests/Node/Expression/ParentTest.php | 28 +
.../Twig/Tests/Node/Expression/TestTest.php | 82 ++
.../Tests/Node/Expression/Unary/NegTest.php | 32 +
.../Tests/Node/Expression/Unary/NotTest.php | 31 +
.../Tests/Node/Expression/Unary/PosTest.php | 31 +
.../twig/test/Twig/Tests/Node/ForTest.php | 191 +++
.../twig/twig/test/Twig/Tests/Node/IfTest.php | 88 ++
.../twig/test/Twig/Tests/Node/ImportTest.php | 40 +
.../twig/test/Twig/Tests/Node/IncludeTest.php | 83 ++
.../twig/test/Twig/Tests/Node/MacroTest.php | 70 +
.../twig/test/Twig/Tests/Node/ModuleTest.php | 183 +++
.../twig/test/Twig/Tests/Node/PrintTest.php | 29 +
.../twig/test/Twig/Tests/Node/SandboxTest.php | 44 +
.../Twig/Tests/Node/SandboxedPrintTest.php | 33 +
.../twig/test/Twig/Tests/Node/SetTest.php | 69 +
.../test/Twig/Tests/Node/SpacelessTest.php | 37 +
.../twig/test/Twig/Tests/Node/TextTest.php | 28 +
.../Twig/Tests/NodeVisitor/OptimizerTest.php | 124 ++
.../twig/twig/test/Twig/Tests/ParserTest.php | 196 +++
.../Tests/Profiler/Dumper/AbstractTest.php | 101 ++
.../Tests/Profiler/Dumper/BlackfireTest.php | 32 +
.../Twig/Tests/Profiler/Dumper/HtmlTest.php | 30 +
.../Twig/Tests/Profiler/Dumper/TextTest.php | 30 +
.../test/Twig/Tests/Profiler/ProfileTest.php | 100 ++
.../twig/test/Twig/Tests/TemplateTest.php | 693 ++++++++++
.../twig/test/Twig/Tests/TokenStreamTest.php | 70 +
.../twig/test/Twig/Tests/escapingTest.php | 320 +++++
.../twig/vendor/twig/twig/test/bootstrap.php | 13 +
632 files changed, 21617 insertions(+), 3 deletions(-)
create mode 100644 plugins/twig/vendor/autoload.php
create mode 100644 plugins/twig/vendor/twig/twig/.editorconfig
create mode 100644 plugins/twig/vendor/twig/twig/.gitignore
create mode 100644 plugins/twig/vendor/twig/twig/.travis.yml
create mode 100644 plugins/twig/vendor/twig/twig/CHANGELOG
create mode 100644 plugins/twig/vendor/twig/twig/LICENSE
create mode 100644 plugins/twig/vendor/twig/twig/README.rst
create mode 100644 plugins/twig/vendor/twig/twig/composer.json
create mode 100644 plugins/twig/vendor/twig/twig/doc/advanced.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/api.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/coding_standards.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/deprecated.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/abs.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/batch.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/date.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/default.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/escape.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/first.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/format.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/index.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/join.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/keys.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/last.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/length.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/lower.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/merge.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/number_format.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/raw.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/replace.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/reverse.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/round.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/slice.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/sort.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/split.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/striptags.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/title.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/trim.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/upper.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/attribute.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/block.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/constant.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/cycle.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/date.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/dump.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/include.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/index.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/max.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/min.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/parent.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/random.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/range.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/source.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/index.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/installation.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/internals.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/intro.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/recipes.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/block.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/do.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/embed.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/extends.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/filter.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/flush.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/for.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/from.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/if.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/import.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/include.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/index.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/macro.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/sandbox.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/set.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/spaceless.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/use.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tags/verbatim.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/templates.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/constant.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/defined.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/divisibleby.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/empty.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/even.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/index.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/iterable.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/null.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/odd.rst
create mode 100644 plugins/twig/vendor/twig/twig/doc/tests/sameas.rst
create mode 100644 plugins/twig/vendor/twig/twig/ext/twig/.gitignore
create mode 100644 plugins/twig/vendor/twig/twig/ext/twig/config.m4
create mode 100644 plugins/twig/vendor/twig/twig/ext/twig/config.w32
create mode 100644 plugins/twig/vendor/twig/twig/ext/twig/php_twig.h
create mode 100644 plugins/twig/vendor/twig/twig/ext/twig/twig.c
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Autoloader.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/BaseNodeVisitor.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Cache/Filesystem.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Cache/Null.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/CacheInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Compiler.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/CompilerInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Environment.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Error.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Error/Loader.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Error/Runtime.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Error/Syntax.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/ExistsLoaderInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/ExpressionParser.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Core.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Debug.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Escaper.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/GlobalsInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/InitRuntimeInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Optimizer.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Profiler.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Sandbox.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/Staging.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Extension/StringLoader.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/ExtensionInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/FileExtensionEscapingStrategy.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Filter.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Filter/Function.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Filter/Method.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Filter/Node.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/FilterCallableInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/FilterInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Function.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Function/Function.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Function/Method.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Function/Node.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/FunctionCallableInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/FunctionInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Lexer.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/LexerInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Loader/Array.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Loader/Chain.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Loader/Filesystem.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Loader/String.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/LoaderInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Markup.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/AutoEscape.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Block.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/BlockReference.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Body.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/CheckSecurity.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Do.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Embed.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Array.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/AssignName.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Add.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/And.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/BitwiseAnd.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/BitwiseOr.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/BitwiseXor.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Concat.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Div.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/EndsWith.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Equal.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/FloorDiv.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Greater.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/GreaterEqual.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/In.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Less.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/LessEqual.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Matches.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Mod.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Mul.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/NotEqual.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/NotIn.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Or.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Power.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Range.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/StartsWith.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Binary/Sub.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/BlockReference.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Call.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Conditional.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Constant.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/ExtensionReference.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Filter.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Filter/Default.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Function.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/GetAttr.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/MethodCall.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Name.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/NullCoalesce.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Parent.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/TempName.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Constant.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Defined.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Divisibleby.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Even.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Null.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Odd.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Test/Sameas.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Unary.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Unary/Neg.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Unary/Not.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Expression/Unary/Pos.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Flush.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/For.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/ForLoop.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/If.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Import.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Include.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Macro.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Module.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Print.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Sandbox.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/SandboxedPrint.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Set.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/SetTemp.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Spaceless.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Node/Text.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeOutputInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeTraverser.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeVisitor/Escaper.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeVisitor/Optimizer.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeVisitor/SafeAnalysis.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeVisitor/Sandbox.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/NodeVisitorInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Parser.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/ParserInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/Dumper/Blackfire.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/Dumper/Html.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/Dumper/Text.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/Node/EnterProfile.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/Node/LeaveProfile.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/NodeVisitor/Profiler.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Profiler/Profile.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Sandbox/SecurityError.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Sandbox/SecurityNotAllowedTagError.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Sandbox/SecurityPolicy.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Sandbox/SecurityPolicyInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/SimpleFilter.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/SimpleFunction.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/SimpleTest.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Template.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TemplateInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Test.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Test/Function.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Test/IntegrationTestCase.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Test/Method.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Test/Node.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Test/NodeTestCase.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TestCallableInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TestInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Token.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/AutoEscape.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Block.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Do.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Embed.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Extends.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Filter.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Flush.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/For.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/From.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/If.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Import.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Include.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Macro.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Sandbox.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Set.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Spaceless.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParser/Use.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParserBroker.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParserBrokerInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenParserInterface.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/TokenStream.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Util/DeprecationCollector.php (100%)
rename plugins/twig/vendor/twig/{ => twig}/lib/Twig/Util/TemplateDirIterator.php (100%)
create mode 100644 plugins/twig/vendor/twig/twig/phpunit.xml.dist
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/filename.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/LexerTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_empty_parent.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_nonexistent_parent.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_null_parent.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_valid_parent.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/parent.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/spare_parent.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme1/blocks.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme2/blocks.html.twig
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/ParserTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/escapingTest.php
create mode 100644 plugins/twig/vendor/twig/twig/test/bootstrap.php
diff --git a/plugins/twig/composer.json b/plugins/twig/composer.json
index f248dbe3..7a04e2ac 100644
--- a/plugins/twig/composer.json
+++ b/plugins/twig/composer.json
@@ -4,5 +4,8 @@
"description": "Herbie Twig Plugin.",
"keywords": ["herbie", "plugin", "twig"],
"type": "herbie-plugin",
- "license": "BSD-3-Clause"
-}
\ No newline at end of file
+ "license": "BSD-3-Clause",
+ "require": {
+ "twig/twig": "v1.24.0"
+ }
+}
diff --git a/plugins/twig/twig.php b/plugins/twig/twig.php
index c0569c2c..bbffabf4 100644
--- a/plugins/twig/twig.php
+++ b/plugins/twig/twig.php
@@ -23,7 +23,7 @@ public function initTwig()
// Add custom namespace path to Imagine lib
$vendorDir = $config->get('site.path') . '/../vendor';
$autoload = require($vendorDir . '/autoload.php');
- $autoload->add('Twig_', __DIR__ . '/vendor/twig/lib');
+ $autoload->add('Twig_', __DIR__ . '/vendor/twig/twig/lib');
$this->twig = new Twig($config);
$this->twig->init();
diff --git a/plugins/twig/vendor/autoload.php b/plugins/twig/vendor/autoload.php
new file mode 100644
index 00000000..606718a5
--- /dev/null
+++ b/plugins/twig/vendor/autoload.php
@@ -0,0 +1,7 @@
+> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi
+ - if [ ${TRAVIS_PHP_VERSION:0:3} == "5.2" ]; then sed -i.bak "s|vendor/autoload.php|test/bootstrap.php|" phpunit.xml.dist; fi
+
+matrix:
+ fast_finish: true
+ exclude:
+ - php: hhvm
+ env: TWIG_EXT=yes
+ allow_failures:
+ - php: 7.0
+ env: TWIG_EXT=yes
diff --git a/plugins/twig/vendor/twig/twig/CHANGELOG b/plugins/twig/vendor/twig/twig/CHANGELOG
new file mode 100644
index 00000000..85de10dd
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/CHANGELOG
@@ -0,0 +1,828 @@
+* 1.24.0 (2016-01-25)
+
+ * adding support for the ?? operator
+ * fixed the defined test when used on a constant, a map, or a sequence
+ * undeprecated _self (should only be used to get the template name, not the template instance)
+ * fixed parsing on PHP7
+
+* 1.23.3 (2016-01-11)
+
+ * fixed typo
+
+* 1.23.2 (2015-01-11)
+
+ * added versions in deprecated messages
+ * made file cache tolerant for trailing (back)slashes on directory configuration
+ * deprecated unused Twig_Node_Expression_ExtensionReference class
+
+* 1.23.1 (2015-11-05)
+
+ * fixed some exception messages which triggered PHP warnings
+ * fixed BC on Twig_Test_NodeTestCase
+
+* 1.23.0 (2015-10-29)
+
+ * deprecated the possibility to override an extension by registering another one with the same name
+ * deprecated Twig_ExtensionInterface::getGlobals() (added Twig_Extension_GlobalsInterface for BC)
+ * deprecated Twig_ExtensionInterface::initRuntime() (added Twig_Extension_InitRuntimeInterface for BC)
+ * deprecated Twig_Environment::computeAlternatives()
+
+* 1.22.3 (2015-10-13)
+
+ * fixed regression when using null as a cache strategy
+ * improved performance when checking template freshness
+ * fixed warnings when loaded templates do not exist
+ * fixed template class name generation to prevent possible collisions
+ * fixed logic for custom escapers to call them even on integers and null values
+ * changed template cache names to take into account the Twig C extension
+
+* 1.22.2 (2015-09-22)
+
+ * fixed a race condition in template loading
+
+* 1.22.1 (2015-09-15)
+
+ * fixed regression in template_from_string
+
+* 1.22.0 (2015-09-13)
+
+ * made Twig_Test_IntegrationTestCase more flexible
+ * added an option to force PHP bytecode invalidation when writing a compiled template into the cache
+ * fixed the profiler duration for the root node
+ * changed template cache names to take into account enabled extensions
+ * deprecated Twig_Environment::clearCacheFiles(), Twig_Environment::getCacheFilename(),
+ Twig_Environment::writeCacheFile(), and Twig_Environment::getTemplateClassPrefix()
+ * added a way to override the filesystem template cache system
+ * added a way to get the original template source from Twig_Template
+
+* 1.21.2 (2015-09-09)
+
+ * fixed variable names for the deprecation triggering code
+ * fixed escaping strategy detection based on filename
+ * added Traversable support for replace, merge, and sort
+ * deprecated support for character by character replacement for the "replace" filter
+
+* 1.21.1 (2015-08-26)
+
+ * fixed regression when using the deprecated Twig_Test_* classes
+
+* 1.21.0 (2015-08-24)
+
+ * added deprecation notices for deprecated features
+ * added a deprecation "framework" for filters/functions/tests and test fixtures
+
+* 1.20.0 (2015-08-12)
+
+ * forbid access to the Twig environment from templates and internal parts of Twig_Template
+ * fixed limited RCEs when in sandbox mode
+ * deprecated Twig_Template::getEnvironment()
+ * deprecated the _self variable for usage outside of the from and import tags
+ * added Twig_BaseNodeVisitor to ease the compatibility of node visitors
+ between 1.x and 2.x
+
+* 1.19.0 (2015-07-31)
+
+ * fixed wrong error message when including an undefined template in a child template
+ * added support for variadic filters, functions, and tests
+ * added support for extra positional arguments in macros
+ * added ignore_missing flag to the source function
+ * fixed batch filter with zero items
+ * deprecated Twig_Environment::clearTemplateCache()
+ * fixed sandbox disabling when using the include function
+
+* 1.18.2 (2015-06-06)
+
+ * fixed template/line guessing in exceptions for nested templates
+ * optimized the number of inodes and the size of realpath cache when using the cache
+
+* 1.18.1 (2015-04-19)
+
+ * fixed memory leaks in the C extension
+ * deprecated Twig_Loader_String
+ * fixed the slice filter when used with a SimpleXMLElement object
+ * fixed filesystem loader when trying to load non-files (like directories)
+
+* 1.18.0 (2015-01-25)
+
+ * fixed some error messages where the line was wrong (unknown variables or argument names)
+ * added a new way to customize the main Module node (via empty nodes)
+ * added Twig_Environment::createTemplate() to create a template from a string
+ * added a profiler
+ * fixed filesystem loader cache when different file paths are used for the same template
+
+* 1.17.0 (2015-01-14)
+
+ * added a 'filename' autoescaping strategy, which dynamically chooses the
+ autoescaping strategy for a template based on template file extension.
+
+* 1.16.3 (2014-12-25)
+
+ * fixed regression for dynamic parent templates
+ * fixed cache management with statcache
+ * fixed a regression in the slice filter
+
+* 1.16.2 (2014-10-17)
+
+ * fixed timezone on dates as strings
+ * fixed 2-words test names when a custom node class is not used
+ * fixed macros when using an argument named like a PHP super global (like GET or POST)
+ * fixed date_modify when working with DateTimeImmutable
+ * optimized for loops
+ * fixed multi-byte characters handling in the split filter
+ * fixed a regression in the in operator
+ * fixed a regression in the slice filter
+
+* 1.16.1 (2014-10-10)
+
+ * improved error reporting in a sandboxed template
+ * fixed missing error file/line information under certain circumstances
+ * fixed wrong error line number in some error messages
+ * fixed the in operator to use strict comparisons
+ * sped up the slice filter
+ * fixed for mb function overload mb_substr acting different
+ * fixed the attribute() function when passing a variable for the arguments
+
+* 1.16.0 (2014-07-05)
+
+ * changed url_encode to always encode according to RFC 3986
+ * fixed inheritance in a 'use'-hierarchy
+ * removed the __toString policy check when the sandbox is disabled
+ * fixed recursively calling blocks in templates with inheritance
+
+* 1.15.1 (2014-02-13)
+
+ * fixed the conversion of the special '0000-00-00 00:00' date
+ * added an error message when trying to import an undefined block from a trait
+ * fixed a C extension crash when accessing defined but uninitialized property.
+
+* 1.15.0 (2013-12-06)
+
+ * made ignoreStrictCheck in Template::getAttribute() works with __call() methods throwing BadMethodCallException
+ * added min and max functions
+ * added the round filter
+ * fixed a bug that prevented the optimizers to be enabled/disabled selectively
+ * fixed first and last filters for UTF-8 strings
+ * added a source function to include the content of a template without rendering it
+ * fixed the C extension sandbox behavior when get or set is prepend to method name
+
+* 1.14.2 (2013-10-30)
+
+ * fixed error filename/line when an error occurs in an included file
+ * allowed operators that contain whitespaces to have more than one whitespace
+ * allowed tests to be made of 1 or 2 words (like "same as" or "divisible by")
+
+* 1.14.1 (2013-10-15)
+
+ * made it possible to use named operators as variables
+ * fixed the possibility to have a variable named 'matches'
+ * added support for PHP 5.5 DateTimeInterface
+
+* 1.14.0 (2013-10-03)
+
+ * fixed usage of the html_attr escaping strategy to avoid double-escaping with the html strategy
+ * added new operators: ends with, starts with, and matches
+ * fixed some compatibility issues with HHVM
+ * added a way to add custom escaping strategies
+ * fixed the C extension compilation on Windows
+ * fixed the batch filter when using a fill argument with an exact match of elements to batch
+ * fixed the filesystem loader cache when a template name exists in several namespaces
+ * fixed template_from_string when the template includes or extends other ones
+ * fixed a crash of the C extension on an edge case
+
+* 1.13.2 (2013-08-03)
+
+ * fixed the error line number for an error occurs in and embedded template
+ * fixed crashes of the C extension on some edge cases
+
+* 1.13.1 (2013-06-06)
+
+ * added the possibility to ignore the filesystem constructor argument in Twig_Loader_Filesystem
+ * fixed Twig_Loader_Chain::exists() for a loader which implements Twig_ExistsLoaderInterface
+ * adjusted backtrace call to reduce memory usage when an error occurs
+ * added support for object instances as the second argument of the constant test
+ * fixed the include function when used in an assignment
+
+* 1.13.0 (2013-05-10)
+
+ * fixed getting a numeric-like item on a variable ('09' for instance)
+ * fixed getting a boolean or float key on an array, so it is consistent with PHP's array access:
+ `{{ array[false] }}` behaves the same as `echo $array[false];` (equals `$array[0]`)
+ * made the escape filter 20% faster for happy path (escaping string for html with UTF-8)
+ * changed ☃ to § in tests
+ * enforced usage of named arguments after positional ones
+
+* 1.12.3 (2013-04-08)
+
+ * fixed a security issue in the filesystem loader where it was possible to include a template one
+ level above the configured path
+ * fixed fatal error that should be an exception when adding a filter/function/test too late
+ * added a batch filter
+ * added support for encoding an array as query string in the url_encode filter
+
+* 1.12.2 (2013-02-09)
+
+ * fixed the timezone used by the date filter and function when the given date contains a timezone (like 2010-01-28T15:00:00+02:00)
+ * fixed globals when getGlobals is called early on
+ * added the first and last filter
+
+* 1.12.1 (2013-01-15)
+
+ * added support for object instances as the second argument of the constant function
+ * relaxed globals management to avoid a BC break
+ * added support for {{ some_string[:2] }}
+
+* 1.12.0 (2013-01-08)
+
+ * added verbatim as an alias for the raw tag to avoid confusion with the raw filter
+ * fixed registration of tests and functions as anonymous functions
+ * fixed globals management
+
+* 1.12.0-RC1 (2012-12-29)
+
+ * added an include function (does the same as the include tag but in a more flexible way)
+ * added the ability to use any PHP callable to define filters, functions, and tests
+ * added a syntax error when using a loop variable that is not defined
+ * added the ability to set default values for macro arguments
+ * added support for named arguments for filters, tests, and functions
+ * moved filters/functions/tests syntax errors to the parser
+ * added support for extended ternary operator syntaxes
+
+* 1.11.1 (2012-11-11)
+
+ * fixed debug info line numbering (was off by 2)
+ * fixed escaping when calling a macro inside another one (regression introduced in 1.9.1)
+ * optimized variable access on PHP 5.4
+ * fixed a crash of the C extension when an exception was thrown from a macro called without being imported (using _self.XXX)
+
+* 1.11.0 (2012-11-07)
+
+ * fixed macro compilation when a variable name is a PHP reserved keyword
+ * changed the date filter behavior to always apply the default timezone, except if false is passed as the timezone
+ * fixed bitwise operator precedences
+ * added the template_from_string function
+ * fixed default timezone usage for the date function
+ * optimized the way Twig exceptions are managed (to make them faster)
+ * added Twig_ExistsLoaderInterface (implementing this interface in your loader make the chain loader much faster)
+
+* 1.10.3 (2012-10-19)
+
+ * fixed wrong template location in some error messages
+ * reverted a BC break introduced in 1.10.2
+ * added a split filter
+
+* 1.10.2 (2012-10-15)
+
+ * fixed macro calls on PHP 5.4
+
+* 1.10.1 (2012-10-15)
+
+ * made a speed optimization to macro calls when imported via the "import" tag
+ * fixed C extension compilation on Windows
+ * fixed a segfault in the C extension when using DateTime objects
+
+* 1.10.0 (2012-09-28)
+
+ * extracted functional tests framework to make it reusable for third-party extensions
+ * added namespaced templates support in Twig_Loader_Filesystem
+ * added Twig_Loader_Filesystem::prependPath()
+ * fixed an error when a token parser pass a closure as a test to the subparse() method
+
+* 1.9.2 (2012-08-25)
+
+ * fixed the in operator for objects that contain circular references
+ * fixed the C extension when accessing a public property of an object implementing the \ArrayAccess interface
+
+* 1.9.1 (2012-07-22)
+
+ * optimized macro calls when auto-escaping is on
+ * fixed wrong parent class for Twig_Function_Node
+ * made Twig_Loader_Chain more explicit about problems
+
+* 1.9.0 (2012-07-13)
+
+ * made the parsing independent of the template loaders
+ * fixed exception trace when an error occurs when rendering a child template
+ * added escaping strategies for CSS, URL, and HTML attributes
+ * fixed nested embed tag calls
+ * added the date_modify filter
+
+* 1.8.3 (2012-06-17)
+
+ * fixed paths in the filesystem loader when passing a path that ends with a slash or a backslash
+ * fixed escaping when a project defines a function named html or js
+ * fixed chmod mode to apply the umask correctly
+
+* 1.8.2 (2012-05-30)
+
+ * added the abs filter
+ * fixed a regression when using a number in template attributes
+ * fixed compiler when mbstring.func_overload is set to 2
+ * fixed DateTimeZone support in date filter
+
+* 1.8.1 (2012-05-17)
+
+ * fixed a regression when dealing with SimpleXMLElement instances in templates
+ * fixed "is_safe" value for the "dump" function when "html_errors" is not defined in php.ini
+ * switched to use mbstring whenever possible instead of iconv (you might need to update your encoding as mbstring and iconv encoding names sometimes differ)
+
+* 1.8.0 (2012-05-08)
+
+ * enforced interface when adding tests, filters, functions, and node visitors from extensions
+ * fixed a side-effect of the date filter where the timezone might be changed
+ * simplified usage of the autoescape tag; the only (optional) argument is now the escaping strategy or false (with a BC layer)
+ * added a way to dynamically change the auto-escaping strategy according to the template "filename"
+ * changed the autoescape option to also accept a supported escaping strategy (for BC, true is equivalent to html)
+ * added an embed tag
+
+* 1.7.0 (2012-04-24)
+
+ * fixed a PHP warning when using CIFS
+ * fixed template line number in some exceptions
+ * added an iterable test
+ * added an error when defining two blocks with the same name in a template
+ * added the preserves_safety option for filters
+ * fixed a PHP notice when trying to access a key on a non-object/array variable
+ * enhanced error reporting when the template file is an instance of SplFileInfo
+ * added Twig_Environment::mergeGlobals()
+ * added compilation checks to avoid misuses of the sandbox tag
+ * fixed filesystem loader freshness logic for high traffic websites
+ * fixed random function when charset is null
+
+* 1.6.5 (2012-04-11)
+
+ * fixed a regression when a template only extends another one without defining any blocks
+
+* 1.6.4 (2012-04-02)
+
+ * fixed PHP notice in Twig_Error::guessTemplateLine() introduced in 1.6.3
+ * fixed performance when compiling large files
+ * optimized parent template creation when the template does not use dynamic inheritance
+
+* 1.6.3 (2012-03-22)
+
+ * fixed usage of Z_ADDREF_P for PHP 5.2 in the C extension
+ * fixed compilation of numeric values used in templates when using a locale where the decimal separator is not a dot
+ * made the strategy used to guess the real template file name and line number in exception messages much faster and more accurate
+
+* 1.6.2 (2012-03-18)
+
+ * fixed sandbox mode when used with inheritance
+ * added preserveKeys support for the slice filter
+ * fixed the date filter when a DateTime instance is passed with a specific timezone
+ * added a trim filter
+
+* 1.6.1 (2012-02-29)
+
+ * fixed Twig C extension
+ * removed the creation of Twig_Markup instances when not needed
+ * added a way to set the default global timezone for dates
+ * fixed the slice filter on strings when the length is not specified
+ * fixed the creation of the cache directory in case of a race condition
+
+* 1.6.0 (2012-02-04)
+
+ * fixed raw blocks when used with the whitespace trim option
+ * made a speed optimization to macro calls when imported via the "from" tag
+ * fixed globals, parsers, visitors, filters, tests, and functions management in Twig_Environment when a new one or new extension is added
+ * fixed the attribute function when passing arguments
+ * added slice notation support for the [] operator (syntactic sugar for the slice operator)
+ * added a slice filter
+ * added string support for the reverse filter
+ * fixed the empty test and the length filter for Twig_Markup instances
+ * added a date function to ease date comparison
+ * fixed unary operators precedence
+ * added recursive parsing support in the parser
+ * added string and integer handling for the random function
+
+* 1.5.1 (2012-01-05)
+
+ * fixed a regression when parsing strings
+
+* 1.5.0 (2012-01-04)
+
+ * added Traversable objects support for the join filter
+
+* 1.5.0-RC2 (2011-12-30)
+
+ * added a way to set the default global date interval format
+ * fixed the date filter for DateInterval instances (setTimezone() does not exist for them)
+ * refactored Twig_Template::display() to ease its extension
+ * added a number_format filter
+
+* 1.5.0-RC1 (2011-12-26)
+
+ * removed the need to quote hash keys
+ * allowed hash keys to be any expression
+ * added a do tag
+ * added a flush tag
+ * added support for dynamically named filters and functions
+ * added a dump function to help debugging templates
+ * added a nl2br filter
+ * added a random function
+ * added a way to change the default format for the date filter
+ * fixed the lexer when an operator ending with a letter ends a line
+ * added string interpolation support
+ * enhanced exceptions for unknown filters, functions, tests, and tags
+
+* 1.4.0 (2011-12-07)
+
+ * fixed lexer when using big numbers (> PHP_INT_MAX)
+ * added missing preserveKeys argument to the reverse filter
+ * fixed macros containing filter tag calls
+
+* 1.4.0-RC2 (2011-11-27)
+
+ * removed usage of Reflection in Twig_Template::getAttribute()
+ * added a C extension that can optionally replace Twig_Template::getAttribute()
+ * added negative timestamp support to the date filter
+
+* 1.4.0-RC1 (2011-11-20)
+
+ * optimized variable access when using PHP 5.4
+ * changed the precedence of the .. operator to be more consistent with languages that implements such a feature like Ruby
+ * added an Exception to Twig_Loader_Array::isFresh() method when the template does not exist to be consistent with other loaders
+ * added Twig_Function_Node to allow more complex functions to have their own Node class
+ * added Twig_Filter_Node to allow more complex filters to have their own Node class
+ * added Twig_Test_Node to allow more complex tests to have their own Node class
+ * added a better error message when a template is empty but contain a BOM
+ * fixed "in" operator for empty strings
+ * fixed the "defined" test and the "default" filter (now works with more than one call (foo.bar.foo) and for both values of the strict_variables option)
+ * changed the way extensions are loaded (addFilter/addFunction/addGlobal/addTest/addNodeVisitor/addTokenParser/addExtension can now be called in any order)
+ * added Twig_Environment::display()
+ * made the escape filter smarter when the encoding is not supported by PHP
+ * added a convert_encoding filter
+ * moved all node manipulations outside the compile() Node method
+ * made several speed optimizations
+
+* 1.3.0 (2011-10-08)
+
+no changes
+
+* 1.3.0-RC1 (2011-10-04)
+
+ * added an optimization for the parent() function
+ * added cache reloading when auto_reload is true and an extension has been modified
+ * added the possibility to force the escaping of a string already marked as safe (instance of Twig_Markup)
+ * allowed empty templates to be used as traits
+ * added traits support for the "parent" function
+
+* 1.2.0 (2011-09-13)
+
+no changes
+
+* 1.2.0-RC1 (2011-09-10)
+
+ * enhanced the exception when a tag remains unclosed
+ * added support for empty Countable objects for the "empty" test
+ * fixed algorithm that determines if a template using inheritance is valid (no output between block definitions)
+ * added better support for encoding problems when escaping a string (available as of PHP 5.4)
+ * added a way to ignore a missing template when using the "include" tag ({% include "foo" ignore missing %})
+ * added support for an array of templates to the "include" and "extends" tags ({% include ['foo', 'bar'] %})
+ * added support for bitwise operators in expressions
+ * added the "attribute" function to allow getting dynamic attributes on variables
+ * added Twig_Loader_Chain
+ * added Twig_Loader_Array::setTemplate()
+ * added an optimization for the set tag when used to capture a large chunk of static text
+ * changed name regex to match PHP one "[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*" (works for blocks, tags, functions, filters, and macros)
+ * removed the possibility to use the "extends" tag from a block
+ * added "if" modifier support to "for" loops
+
+* 1.1.2 (2011-07-30)
+
+ * fixed json_encode filter on PHP 5.2
+ * fixed regression introduced in 1.1.1 ({{ block(foo|lower) }})
+ * fixed inheritance when using conditional parents
+ * fixed compilation of templates when the body of a child template is not empty
+ * fixed output when a macro throws an exception
+ * fixed a parsing problem when a large chunk of text is enclosed in a comment tag
+ * added PHPDoc for all Token parsers and Core extension functions
+
+* 1.1.1 (2011-07-17)
+
+ * added a performance optimization in the Optimizer (also helps to lower the number of nested level calls)
+ * made some performance improvement for some edge cases
+
+* 1.1.0 (2011-06-28)
+
+ * fixed json_encode filter
+
+* 1.1.0-RC3 (2011-06-24)
+
+ * fixed method case-sensitivity when using the sandbox mode
+ * added timezone support for the date filter
+ * fixed possible security problems with NUL bytes
+
+* 1.1.0-RC2 (2011-06-16)
+
+ * added an exception when the template passed to "use" is not a string
+ * made 'a.b is defined' not throw an exception if a is not defined (in strict mode)
+ * added {% line \d+ %} directive
+
+* 1.1.0-RC1 (2011-05-28)
+
+Flush your cache after upgrading.
+
+ * fixed date filter when using a timestamp
+ * fixed the defined test for some cases
+ * fixed a parsing problem when a large chunk of text is enclosed in a raw tag
+ * added support for horizontal reuse of template blocks (see docs for more information)
+ * added whitespace control modifier to all tags (see docs for more information)
+ * added null as an alias for none (the null test is also an alias for the none test now)
+ * made TRUE, FALSE, NONE equivalent to their lowercase counterparts
+ * wrapped all compilation and runtime exceptions with Twig_Error_Runtime and added logic to guess the template name and line
+ * moved display() method to Twig_Template (generated templates should now use doDisplay() instead)
+
+* 1.0.0 (2011-03-27)
+
+ * fixed output when using mbstring
+ * fixed duplicate call of methods when using the sandbox
+ * made the charset configurable for the escape filter
+
+* 1.0.0-RC2 (2011-02-21)
+
+ * changed the way {% set %} works when capturing (the content is now marked as safe)
+ * added support for macro name in the endmacro tag
+ * make Twig_Error compatible with PHP 5.3.0 >
+ * fixed an infinite loop on some Windows configurations
+ * fixed the "length" filter for numbers
+ * fixed Template::getAttribute() as properties in PHP are case sensitive
+ * removed coupling between Twig_Node and Twig_Template
+ * fixed the ternary operator precedence rule
+
+* 1.0.0-RC1 (2011-01-09)
+
+Backward incompatibilities:
+
+ * the "items" filter, which has been deprecated for quite a long time now, has been removed
+ * the "range" filter has been converted to a function: 0|range(10) -> range(0, 10)
+ * the "constant" filter has been converted to a function: {{ some_date|date('DATE_W3C'|constant) }} -> {{ some_date|date(constant('DATE_W3C')) }}
+ * the "cycle" filter has been converted to a function: {{ ['odd', 'even']|cycle(i) }} -> {{ cycle(['odd', 'even'], i) }}
+ * the "for" tag does not support "joined by" anymore
+ * the "autoescape" first argument is now "true"/"false" (instead of "on"/"off")
+ * the "parent" tag has been replaced by a "parent" function ({{ parent() }} instead of {% parent %})
+ * the "display" tag has been replaced by a "block" function ({{ block('title') }} instead of {% display title %})
+ * removed the grammar and simple token parser (moved to the Twig Extensions repository)
+
+Changes:
+
+ * added "needs_context" option for filters and functions (the context is then passed as a first argument)
+ * added global variables support
+ * made macros return their value instead of echoing directly (fixes calling a macro in sandbox mode)
+ * added the "from" tag to import macros as functions
+ * added support for functions (a function is just syntactic sugar for a getAttribute() call)
+ * made macros callable when sandbox mode is enabled
+ * added an exception when a macro uses a reserved name
+ * the "default" filter now uses the "empty" test instead of just checking for null
+ * added the "empty" test
+
+* 0.9.10 (2010-12-16)
+
+Backward incompatibilities:
+
+ * The Escaper extension is enabled by default, which means that all displayed
+ variables are now automatically escaped. You can revert to the previous
+ behavior by removing the extension via $env->removeExtension('escaper')
+ or just set the 'autoescape' option to 'false'.
+ * removed the "without loop" attribute for the "for" tag (not needed anymore
+ as the Optimizer take care of that for most cases)
+ * arrays and hashes have now a different syntax
+ * arrays keep the same syntax with square brackets: [1, 2]
+ * hashes now use curly braces (["a": "b"] should now be written as {"a": "b"})
+ * support for "arrays with keys" and "hashes without keys" is not supported anymore ([1, "foo": "bar"] or {"foo": "bar", 1})
+ * the i18n extension is now part of the Twig Extensions repository
+
+Changes:
+
+ * added the merge filter
+ * removed 'is_escaper' option for filters (a left over from the previous version) -- you must use 'is_safe' now instead
+ * fixed usage of operators as method names (like is, in, and not)
+ * changed the order of execution for node visitors
+ * fixed default() filter behavior when used with strict_variables set to on
+ * fixed filesystem loader compatibility with PHAR files
+ * enhanced error messages when an unexpected token is parsed in an expression
+ * fixed filename not being added to syntax error messages
+ * added the autoescape option to enable/disable autoescaping
+ * removed the newline after a comment (mimics PHP behavior)
+ * added a syntax error exception when parent block is used on a template that does not extend another one
+ * made the Escaper extension enabled by default
+ * fixed sandbox extension when used with auto output escaping
+ * fixed escaper when wrapping a Twig_Node_Print (the original class must be preserved)
+ * added an Optimizer extension (enabled by default; optimizes "for" loops and "raw" filters)
+ * added priority to node visitors
+
+* 0.9.9 (2010-11-28)
+
+Backward incompatibilities:
+ * the self special variable has been renamed to _self
+ * the odd and even filters are now tests:
+ {{ foo|odd }} must now be written {{ foo is odd }}
+ * the "safe" filter has been renamed to "raw"
+ * in Node classes,
+ sub-nodes are now accessed via getNode() (instead of property access)
+ attributes via getAttribute() (instead of array access)
+ * the urlencode filter had been renamed to url_encode
+ * the include tag now merges the passed variables with the current context by default
+ (the old behavior is still possible by adding the "only" keyword)
+ * moved Exceptions to Twig_Error_* (Twig_SyntaxError/Twig_RuntimeError are now Twig_Error_Syntax/Twig_Error_Runtime)
+ * removed support for {{ 1 < i < 3 }} (use {{ i > 1 and i < 3 }} instead)
+ * the "in" filter has been removed ({{ a|in(b) }} should now be written {{ a in b }})
+
+Changes:
+ * added file and line to Twig_Error_Runtime exceptions thrown from Twig_Template
+ * changed trans tag to accept any variable for the plural count
+ * fixed sandbox mode (__toString() method check was not enforced if called implicitly from complex statements)
+ * added the ** (power) operator
+ * changed the algorithm used for parsing expressions
+ * added the spaceless tag
+ * removed trim_blocks option
+ * added support for is*() methods for attributes (foo.bar now looks for foo->getBar() or foo->isBar())
+ * changed all exceptions to extend Twig_Error
+ * fixed unary expressions ({{ not(1 or 0) }})
+ * fixed child templates (with an extend tag) that uses one or more imports
+ * added support for {{ 1 not in [2, 3] }} (more readable than the current {{ not (1 in [2, 3]) }})
+ * escaping has been rewritten
+ * the implementation of template inheritance has been rewritten
+ (blocks can now be called individually and still work with inheritance)
+ * fixed error handling for if tag when a syntax error occurs within a subparse process
+ * added a way to implement custom logic for resolving token parsers given a tag name
+ * fixed js escaper to be stricter (now uses a whilelist-based js escaper)
+ * added the following filers: "constant", "trans", "replace", "json_encode"
+ * added a "constant" test
+ * fixed objects with __toString() not being autoescaped
+ * fixed subscript expressions when calling __call() (methods now keep the case)
+ * added "test" feature (accessible via the "is" operator)
+ * removed the debug tag (should be done in an extension)
+ * fixed trans tag when no vars are used in plural form
+ * fixed race condition when writing template cache
+ * added the special _charset variable to reference the current charset
+ * added the special _context variable to reference the current context
+ * renamed self to _self (to avoid conflict)
+ * fixed Twig_Template::getAttribute() for protected properties
+
+* 0.9.8 (2010-06-28)
+
+Backward incompatibilities:
+ * the trans tag plural count is now attached to the plural tag:
+ old: `{% trans count %}...{% plural %}...{% endtrans %}`
+ new: `{% trans %}...{% plural count %}...{% endtrans %}`
+
+ * added a way to translate strings coming from a variable ({% trans var %})
+ * fixed trans tag when used with the Escaper extension
+ * fixed default cache umask
+ * removed Twig_Template instances from the debug tag output
+ * fixed objects with __isset() defined
+ * fixed set tag when used with a capture
+ * fixed type hinting for Twig_Environment::addFilter() method
+
+* 0.9.7 (2010-06-12)
+
+Backward incompatibilities:
+ * changed 'as' to '=' for the set tag ({% set title as "Title" %} must now be {% set title = "Title" %})
+ * removed the sandboxed attribute of the include tag (use the new sandbox tag instead)
+ * refactored the Node system (if you have custom nodes, you will have to update them to use the new API)
+
+ * added self as a special variable that refers to the current template (useful for importing macros from the current template)
+ * added Twig_Template instance support to the include tag
+ * added support for dynamic and conditional inheritance ({% extends some_var %} and {% extends standalone ? "minimum" : "base" %})
+ * added a grammar sub-framework to ease the creation of custom tags
+ * fixed the for tag for large arrays (some loop variables are now only available for arrays and objects that implement the Countable interface)
+ * removed the Twig_Resource::resolveMissingFilter() method
+ * fixed the filter tag which did not apply filtering to included files
+ * added a bunch of unit tests
+ * added a bunch of phpdoc
+ * added a sandbox tag in the sandbox extension
+ * changed the date filter to support any date format supported by DateTime
+ * added strict_variable setting to throw an exception when an invalid variable is used in a template (disabled by default)
+ * added the lexer, parser, and compiler as arguments to the Twig_Environment constructor
+ * changed the cache option to only accepts an explicit path to a cache directory or false
+ * added a way to add token parsers, filters, and visitors without creating an extension
+ * added three interfaces: Twig_NodeInterface, Twig_TokenParserInterface, and Twig_FilterInterface
+ * changed the generated code to match the new coding standards
+ * fixed sandbox mode (__toString() method check was not enforced if called implicitly from a simple statement like {{ article }})
+ * added an exception when a child template has a non-empty body (as it is always ignored when rendering)
+
+* 0.9.6 (2010-05-12)
+
+ * fixed variables defined outside a loop and for which the value changes in a for loop
+ * fixed the test suite for PHP 5.2 and older versions of PHPUnit
+ * added support for __call() in expression resolution
+ * fixed node visiting for macros (macros are now visited by visitors as any other node)
+ * fixed nested block definitions with a parent call (rarely useful but nonetheless supported now)
+ * added the cycle filter
+ * fixed the Lexer when mbstring.func_overload is used with an mbstring.internal_encoding different from ASCII
+ * added a long-syntax for the set tag ({% set foo %}...{% endset %})
+ * unit tests are now powered by PHPUnit
+ * added support for gettext via the `i18n` extension
+ * fixed twig_capitalize_string_filter() and fixed twig_length_filter() when used with UTF-8 values
+ * added a more useful exception if an if tag is not closed properly
+ * added support for escaping strategy in the autoescape tag
+ * fixed lexer when a template has a big chunk of text between/in a block
+
+* 0.9.5 (2010-01-20)
+
+As for any new release, don't forget to remove all cached templates after
+upgrading.
+
+If you have defined custom filters, you MUST upgrade them for this release. To
+upgrade, replace "array" with "new Twig_Filter_Function", and replace the
+environment constant by the "needs_environment" option:
+
+ // before
+ 'even' => array('twig_is_even_filter', false),
+ 'escape' => array('twig_escape_filter', true),
+
+ // after
+ 'even' => new Twig_Filter_Function('twig_is_even_filter'),
+ 'escape' => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true)),
+
+If you have created NodeTransformer classes, you will need to upgrade them to
+the new interface (please note that the interface is not yet considered
+stable).
+
+ * fixed list nodes that did not extend the Twig_NodeListInterface
+ * added the "without loop" option to the for tag (it disables the generation of the loop variable)
+ * refactored node transformers to node visitors
+ * fixed automatic-escaping for blocks
+ * added a way to specify variables to pass to an included template
+ * changed the automatic-escaping rules to be more sensible and more configurable in custom filters (the documentation lists all the rules)
+ * improved the filter system to allow object methods to be used as filters
+ * changed the Array and String loaders to actually make use of the cache mechanism
+ * included the default filter function definitions in the extension class files directly (Core, Escaper)
+ * added the // operator (like the floor() PHP function)
+ * added the .. operator (as a syntactic sugar for the range filter when the step is 1)
+ * added the in operator (as a syntactic sugar for the in filter)
+ * added the following filters in the Core extension: in, range
+ * added support for arrays (same behavior as in PHP, a mix between lists and dictionaries, arrays and hashes)
+ * enhanced some error messages to provide better feedback in case of parsing errors
+
+* 0.9.4 (2009-12-02)
+
+If you have custom loaders, you MUST upgrade them for this release: The
+Twig_Loader base class has been removed, and the Twig_LoaderInterface has also
+been changed (see the source code for more information or the documentation).
+
+ * added support for DateTime instances for the date filter
+ * fixed loop.last when the array only has one item
+ * made it possible to insert newlines in tag and variable blocks
+ * fixed a bug when a literal '\n' were present in a template text
+ * fixed bug when the filename of a template contains */
+ * refactored loaders
+
+* 0.9.3 (2009-11-11)
+
+This release is NOT backward compatible with the previous releases.
+
+ The loaders do not take the cache and autoReload arguments anymore. Instead,
+ the Twig_Environment class has two new options: cache and auto_reload.
+ Upgrading your code means changing this kind of code:
+
+ $loader = new Twig_Loader_Filesystem('/path/to/templates', '/path/to/compilation_cache', true);
+ $twig = new Twig_Environment($loader);
+
+ to something like this:
+
+ $loader = new Twig_Loader_Filesystem('/path/to/templates');
+ $twig = new Twig_Environment($loader, array(
+ 'cache' => '/path/to/compilation_cache',
+ 'auto_reload' => true,
+ ));
+
+ * deprecated the "items" filter as it is not needed anymore
+ * made cache and auto_reload options of Twig_Environment instead of arguments of Twig_Loader
+ * optimized template loading speed
+ * removed output when an error occurs in a template and render() is used
+ * made major speed improvements for loops (up to 300% on even the smallest loops)
+ * added properties as part of the sandbox mode
+ * added public properties support (obj.item can now be the item property on the obj object)
+ * extended set tag to support expression as value ({% set foo as 'foo' ~ 'bar' %} )
+ * fixed bug when \ was used in HTML
+
+* 0.9.2 (2009-10-29)
+
+ * made some speed optimizations
+ * changed the cache extension to .php
+ * added a js escaping strategy
+ * added support for short block tag
+ * changed the filter tag to allow chained filters
+ * made lexer more flexible as you can now change the default delimiters
+ * added set tag
+ * changed default directory permission when cache dir does not exist (more secure)
+ * added macro support
+ * changed filters first optional argument to be a Twig_Environment instance instead of a Twig_Template instance
+ * made Twig_Autoloader::autoload() a static method
+ * avoid writing template file if an error occurs
+ * added $ escaping when outputting raw strings
+ * enhanced some error messages to ease debugging
+ * fixed empty cache files when the template contains an error
+
+* 0.9.1 (2009-10-14)
+
+ * fixed a bug in PHP 5.2.6
+ * fixed numbers with one than one decimal
+ * added support for method calls with arguments ({{ foo.bar('a', 43) }})
+ * made small speed optimizations
+ * made minor tweaks to allow better extensibility and flexibility
+
+* 0.9.0 (2009-10-12)
+
+ * Initial release
diff --git a/plugins/twig/vendor/twig/twig/LICENSE b/plugins/twig/vendor/twig/twig/LICENSE
new file mode 100644
index 00000000..cc74f810
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/LICENSE
@@ -0,0 +1,31 @@
+Copyright (c) 2009-2016 by the Twig Team.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * The names of the contributors may not be used to endorse or
+ promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/plugins/twig/vendor/twig/twig/README.rst b/plugins/twig/vendor/twig/twig/README.rst
new file mode 100644
index 00000000..81737b0b
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/README.rst
@@ -0,0 +1,15 @@
+Twig, the flexible, fast, and secure template language for PHP
+==============================================================
+
+Twig is a template language for PHP, released under the new BSD license (code
+and documentation).
+
+Twig uses a syntax similar to the Django and Jinja template languages which
+inspired the Twig runtime environment.
+
+More Information
+----------------
+
+Read the `documentation`_ for more information.
+
+.. _documentation: http://twig.sensiolabs.org/documentation
diff --git a/plugins/twig/vendor/twig/twig/composer.json b/plugins/twig/vendor/twig/twig/composer.json
new file mode 100644
index 00000000..507d8aec
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/composer.json
@@ -0,0 +1,46 @@
+{
+ "name": "twig/twig",
+ "type": "library",
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "keywords": ["templating"],
+ "homepage": "http://twig.sensiolabs.org",
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Twig Team",
+ "homepage": "http://twig.sensiolabs.org/contributors",
+ "role": "Contributors"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ }
+ ],
+ "support": {
+ "forum": "https://groups.google.com/forum/#!forum/twig-users"
+ },
+ "require": {
+ "php": ">=5.2.7"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7",
+ "symfony/debug": "~2.7"
+ },
+ "autoload": {
+ "psr-0" : {
+ "Twig_" : "lib/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.24-dev"
+ }
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/doc/advanced.rst b/plugins/twig/vendor/twig/twig/doc/advanced.rst
new file mode 100644
index 00000000..5b436ff2
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/advanced.rst
@@ -0,0 +1,872 @@
+Extending Twig
+==============
+
+.. caution::
+
+ This section describes how to extend Twig as of **Twig 1.12**. If you are
+ using an older version, read the :doc:`legacy` chapter
+ instead.
+
+Twig can be extended in many ways; you can add extra tags, filters, tests,
+operators, global variables, and functions. You can even extend the parser
+itself with node visitors.
+
+.. note::
+
+ The first section of this chapter describes how to extend Twig easily. If
+ you want to reuse your changes in different projects or if you want to
+ share them with others, you should then create an extension as described
+ in the following section.
+
+.. caution::
+
+ When extending Twig without creating an extension, Twig won't be able to
+ recompile your templates when the PHP code is updated. To see your changes
+ in real-time, either disable template caching or package your code into an
+ extension (see the next section of this chapter).
+
+Before extending Twig, you must understand the differences between all the
+different possible extension points and when to use them.
+
+First, remember that Twig has two main language constructs:
+
+* ``{{ }}``: used to print the result of an expression evaluation;
+
+* ``{% %}``: used to execute statements.
+
+To understand why Twig exposes so many extension points, let's see how to
+implement a *Lorem ipsum* generator (it needs to know the number of words to
+generate).
+
+You can use a ``lipsum`` *tag*:
+
+.. code-block:: jinja
+
+ {% lipsum 40 %}
+
+That works, but using a tag for ``lipsum`` is not a good idea for at least
+three main reasons:
+
+* ``lipsum`` is not a language construct;
+* The tag outputs something;
+* The tag is not flexible as you cannot use it in an expression:
+
+ .. code-block:: jinja
+
+ {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }}
+
+In fact, you rarely need to create tags; and that's good news because tags are
+the most complex extension point of Twig.
+
+Now, let's use a ``lipsum`` *filter*:
+
+.. code-block:: jinja
+
+ {{ 40|lipsum }}
+
+Again, it works, but it looks weird. A filter transforms the passed value to
+something else but here we use the value to indicate the number of words to
+generate (so, ``40`` is an argument of the filter, not the value we want to
+transform).
+
+Next, let's use a ``lipsum`` *function*:
+
+.. code-block:: jinja
+
+ {{ lipsum(40) }}
+
+Here we go. For this specific example, the creation of a function is the
+extension point to use. And you can use it anywhere an expression is accepted:
+
+.. code-block:: jinja
+
+ {{ 'some text' ~ lipsum(40) ~ 'some more text' }}
+
+ {% set lipsum = lipsum(40) %}
+
+Last but not the least, you can also use a *global* object with a method able
+to generate lorem ipsum text:
+
+.. code-block:: jinja
+
+ {{ text.lipsum(40) }}
+
+As a rule of thumb, use functions for frequently used features and global
+objects for everything else.
+
+Keep in mind the following when you want to extend Twig:
+
+========== ========================== ========== =========================
+What? Implementation difficulty? How often? When?
+========== ========================== ========== =========================
+*macro* trivial frequent Content generation
+*global* trivial frequent Helper object
+*function* trivial frequent Content generation
+*filter* trivial frequent Value transformation
+*tag* complex rare DSL language construct
+*test* trivial rare Boolean decision
+*operator* trivial rare Values transformation
+========== ========================== ========== =========================
+
+Globals
+-------
+
+A global variable is like any other template variable, except that it's
+available in all templates and macros::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addGlobal('text', new Text());
+
+You can then use the ``text`` variable anywhere in a template:
+
+.. code-block:: jinja
+
+ {{ text.lipsum(40) }}
+
+Filters
+-------
+
+Creating a filter is as simple as associating a name with a PHP callable::
+
+ // an anonymous function
+ $filter = new Twig_SimpleFilter('rot13', function ($string) {
+ return str_rot13($string);
+ });
+
+ // or a simple PHP function
+ $filter = new Twig_SimpleFilter('rot13', 'str_rot13');
+
+ // or a class method
+ $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter'));
+
+The first argument passed to the ``Twig_SimpleFilter`` constructor is the name
+of the filter you will use in templates and the second one is the PHP callable
+to associate with it.
+
+Then, add the filter to your Twig environment::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addFilter($filter);
+
+And here is how to use it in a template:
+
+.. code-block:: jinja
+
+ {{ 'Twig'|rot13 }}
+
+ {# will output Gjvt #}
+
+When called by Twig, the PHP callable receives the left side of the filter
+(before the pipe ``|``) as the first argument and the extra arguments passed
+to the filter (within parentheses ``()``) as extra arguments.
+
+For instance, the following code:
+
+.. code-block:: jinja
+
+ {{ 'TWIG'|lower }}
+ {{ now|date('d/m/Y') }}
+
+is compiled to something like the following::
+
+
+
+
+The ``Twig_SimpleFilter`` class takes an array of options as its last
+argument::
+
+ $filter = new Twig_SimpleFilter('rot13', 'str_rot13', $options);
+
+Environment-aware Filters
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you want to access the current environment instance in your filter, set the
+``needs_environment`` option to ``true``; Twig will pass the current
+environment as the first argument to the filter call::
+
+ $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $string) {
+ // get the current charset for instance
+ $charset = $env->getCharset();
+
+ return str_rot13($string);
+ }, array('needs_environment' => true));
+
+Context-aware Filters
+~~~~~~~~~~~~~~~~~~~~~
+
+If you want to access the current context in your filter, set the
+``needs_context`` option to ``true``; Twig will pass the current context as
+the first argument to the filter call (or the second one if
+``needs_environment`` is also set to ``true``)::
+
+ $filter = new Twig_SimpleFilter('rot13', function ($context, $string) {
+ // ...
+ }, array('needs_context' => true));
+
+ $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $context, $string) {
+ // ...
+ }, array('needs_context' => true, 'needs_environment' => true));
+
+Automatic Escaping
+~~~~~~~~~~~~~~~~~~
+
+If automatic escaping is enabled, the output of the filter may be escaped
+before printing. If your filter acts as an escaper (or explicitly outputs HTML
+or JavaScript code), you will want the raw output to be printed. In such a
+case, set the ``is_safe`` option::
+
+ $filter = new Twig_SimpleFilter('nl2br', 'nl2br', array('is_safe' => array('html')));
+
+Some filters may need to work on input that is already escaped or safe, for
+example when adding (safe) HTML tags to originally unsafe output. In such a
+case, set the ``pre_escape`` option to escape the input data before it is run
+through your filter::
+
+ $filter = new Twig_SimpleFilter('somefilter', 'somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
+
+Variadic Filters
+~~~~~~~~~~~~~~~~
+
+.. versionadded:: 1.19
+ Support for variadic filters was added in Twig 1.19.
+
+When a filter should accept an arbitrary number of arguments, set the
+``is_variadic`` option to ``true``; Twig will pass the extra arguments as the
+last argument to the filter call as an array::
+
+ $filter = new Twig_SimpleFilter('thumbnail', function ($file, array $options = array()) {
+ // ...
+ }, array('is_variadic' => true));
+
+Be warned that named arguments passed to a variadic filter cannot be checked
+for validity as they will automatically end up in the option array.
+
+Dynamic Filters
+~~~~~~~~~~~~~~~
+
+A filter name containing the special ``*`` character is a dynamic filter as
+the ``*`` can be any string::
+
+ $filter = new Twig_SimpleFilter('*_path', function ($name, $arguments) {
+ // ...
+ });
+
+The following filters will be matched by the above defined dynamic filter:
+
+* ``product_path``
+* ``category_path``
+
+A dynamic filter can define more than one dynamic parts::
+
+ $filter = new Twig_SimpleFilter('*_path_*', function ($name, $suffix, $arguments) {
+ // ...
+ });
+
+The filter will receive all dynamic part values before the normal filter
+arguments, but after the environment and the context. For instance, a call to
+``'foo'|a_path_b()`` will result in the following arguments to be passed to
+the filter: ``('a', 'b', 'foo')``.
+
+Deprecated Filters
+~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 1.21
+ Support for deprecated filters was added in Twig 1.21.
+
+You can mark a filter as being deprecated by setting the ``deprecated`` option
+to ``true``. You can also give an alternative filter that replaces the
+deprecated one when that makes sense::
+
+ $filter = new Twig_SimpleFilter('obsolete', function () {
+ // ...
+ }, array('deprecated' => true, 'alternative' => 'new_one'));
+
+When a filter is deprecated, Twig emits a deprecation notice when compiling a
+template using it. See :ref:`deprecation-notices` for more information.
+
+Functions
+---------
+
+Functions are defined in the exact same way as filters, but you need to create
+an instance of ``Twig_SimpleFunction``::
+
+ $twig = new Twig_Environment($loader);
+ $function = new Twig_SimpleFunction('function_name', function () {
+ // ...
+ });
+ $twig->addFunction($function);
+
+Functions support the same features as filters, except for the ``pre_escape``
+and ``preserves_safety`` options.
+
+Tests
+-----
+
+Tests are defined in the exact same way as filters and functions, but you need
+to create an instance of ``Twig_SimpleTest``::
+
+ $twig = new Twig_Environment($loader);
+ $test = new Twig_SimpleTest('test_name', function () {
+ // ...
+ });
+ $twig->addTest($test);
+
+Tests allow you to create custom application specific logic for evaluating
+boolean conditions. As a simple example, let's create a Twig test that checks if
+objects are 'red'::
+
+ $twig = new Twig_Environment($loader);
+ $test = new Twig_SimpleTest('red', function ($value) {
+ if (isset($value->color) && $value->color == 'red') {
+ return true;
+ }
+ if (isset($value->paint) && $value->paint == 'red') {
+ return true;
+ }
+ return false;
+ });
+ $twig->addTest($test);
+
+Test functions should always return true/false.
+
+When creating tests you can use the ``node_class`` option to provide custom test
+compilation. This is useful if your test can be compiled into PHP primitives.
+This is used by many of the tests built into Twig::
+
+ $twig = new Twig_Environment($loader);
+ $test = new Twig_SimpleTest(
+ 'odd',
+ null,
+ array('node_class' => 'Twig_Node_Expression_Test_Odd'));
+ $twig->addTest($test);
+
+ class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test
+ {
+ public function compile(Twig_Compiler $compiler)
+ {
+ $compiler
+ ->raw('(')
+ ->subcompile($this->getNode('node'))
+ ->raw(' % 2 == 1')
+ ->raw(')')
+ ;
+ }
+ }
+
+The above example shows how you can create tests that use a node class. The
+node class has access to one sub-node called 'node'. This sub-node contains the
+value that is being tested. When the ``odd`` filter is used in code such as:
+
+.. code-block:: jinja
+
+ {% if my_value is odd %}
+
+The ``node`` sub-node will contain an expression of ``my_value``. Node-based
+tests also have access to the ``arguments`` node. This node will contain the
+various other arguments that have been provided to your test.
+
+If you want to pass a variable number of positional or named arguments to the
+test, set the ``is_variadic`` option to ``true``. Tests also support dynamic
+name feature as filters and functions.
+
+Tags
+----
+
+One of the most exciting features of a template engine like Twig is the
+possibility to define new language constructs. This is also the most complex
+feature as you need to understand how Twig's internals work.
+
+Let's create a simple ``set`` tag that allows the definition of simple
+variables from within a template. The tag can be used like follows:
+
+.. code-block:: jinja
+
+ {% set name = "value" %}
+
+ {{ name }}
+
+ {# should output value #}
+
+.. note::
+
+ The ``set`` tag is part of the Core extension and as such is always
+ available. The built-in version is slightly more powerful and supports
+ multiple assignments by default (cf. the template designers chapter for
+ more information).
+
+Three steps are needed to define a new tag:
+
+* Defining a Token Parser class (responsible for parsing the template code);
+
+* Defining a Node class (responsible for converting the parsed code to PHP);
+
+* Registering the tag.
+
+Registering a new tag
+~~~~~~~~~~~~~~~~~~~~~
+
+Adding a tag is as simple as calling the ``addTokenParser`` method on the
+``Twig_Environment`` instance::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addTokenParser(new Project_Set_TokenParser());
+
+Defining a Token Parser
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Now, let's see the actual code of this class::
+
+ class Project_Set_TokenParser extends Twig_TokenParser
+ {
+ public function parse(Twig_Token $token)
+ {
+ $parser = $this->parser;
+ $stream = $parser->getStream();
+
+ $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
+ $stream->expect(Twig_Token::OPERATOR_TYPE, '=');
+ $value = $parser->getExpressionParser()->parseExpression();
+ $stream->expect(Twig_Token::BLOCK_END_TYPE);
+
+ return new Project_Set_Node($name, $value, $token->getLine(), $this->getTag());
+ }
+
+ public function getTag()
+ {
+ return 'set';
+ }
+ }
+
+The ``getTag()`` method must return the tag we want to parse, here ``set``.
+
+The ``parse()`` method is invoked whenever the parser encounters a ``set``
+tag. It should return a ``Twig_Node`` instance that represents the node (the
+``Project_Set_Node`` calls creating is explained in the next section).
+
+The parsing process is simplified thanks to a bunch of methods you can call
+from the token stream (``$this->parser->getStream()``):
+
+* ``getCurrent()``: Gets the current token in the stream.
+
+* ``next()``: Moves to the next token in the stream, *but returns the old one*.
+
+* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether
+ the current token is of a particular type or value (or both). The value may be an
+ array of several possible values.
+
+* ``expect($type[, $value[, $message]])``: If the current token isn't of the given
+ type/value a syntax error is thrown. Otherwise, if the type and value are correct,
+ the token is returned and the stream moves to the next token.
+
+* ``look()``: Looks a the next token without consuming it.
+
+Parsing expressions is done by calling the ``parseExpression()`` like we did for
+the ``set`` tag.
+
+.. tip::
+
+ Reading the existing ``TokenParser`` classes is the best way to learn all
+ the nitty-gritty details of the parsing process.
+
+Defining a Node
+~~~~~~~~~~~~~~~
+
+The ``Project_Set_Node`` class itself is rather simple::
+
+ class Project_Set_Node extends Twig_Node
+ {
+ public function __construct($name, Twig_Node_Expression $value, $line, $tag = null)
+ {
+ parent::__construct(array('value' => $value), array('name' => $name), $line, $tag);
+ }
+
+ public function compile(Twig_Compiler $compiler)
+ {
+ $compiler
+ ->addDebugInfo($this)
+ ->write('$context[\''.$this->getAttribute('name').'\'] = ')
+ ->subcompile($this->getNode('value'))
+ ->raw(";\n")
+ ;
+ }
+ }
+
+The compiler implements a fluid interface and provides methods that helps the
+developer generate beautiful and readable PHP code:
+
+* ``subcompile()``: Compiles a node.
+
+* ``raw()``: Writes the given string as is.
+
+* ``write()``: Writes the given string by adding indentation at the beginning
+ of each line.
+
+* ``string()``: Writes a quoted string.
+
+* ``repr()``: Writes a PHP representation of a given value (see
+ ``Twig_Node_For`` for a usage example).
+
+* ``addDebugInfo()``: Adds the line of the original template file related to
+ the current node as a comment.
+
+* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a
+ usage example).
+
+* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a
+ usage example).
+
+.. _creating_extensions:
+
+Creating an Extension
+---------------------
+
+The main motivation for writing an extension is to move often used code into a
+reusable class like adding support for internationalization. An extension can
+define tags, filters, tests, operators, global variables, functions, and node
+visitors.
+
+Creating an extension also makes for a better separation of code that is
+executed at compilation time and code needed at runtime. As such, it makes
+your code faster.
+
+Most of the time, it is useful to create a single extension for your project,
+to host all the specific tags and filters you want to add to Twig.
+
+.. tip::
+
+ When packaging your code into an extension, Twig is smart enough to
+ recompile your templates whenever you make a change to it (when
+ ``auto_reload`` is enabled).
+
+.. note::
+
+ Before writing your own extensions, have a look at the Twig official
+ extension repository: http://github.com/twigphp/Twig-extensions.
+
+An extension is a class that implements the following interface::
+
+ interface Twig_ExtensionInterface
+ {
+ /**
+ * Initializes the runtime environment.
+ *
+ * This is where you can load some file that contains filter functions for instance.
+ *
+ * @param Twig_Environment $environment The current Twig_Environment instance
+ *
+ * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead
+ */
+ function initRuntime(Twig_Environment $environment);
+
+ /**
+ * Returns the token parser instances to add to the existing list.
+ *
+ * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
+ */
+ function getTokenParsers();
+
+ /**
+ * Returns the node visitor instances to add to the existing list.
+ *
+ * @return array An array of Twig_NodeVisitorInterface instances
+ */
+ function getNodeVisitors();
+
+ /**
+ * Returns a list of filters to add to the existing list.
+ *
+ * @return array An array of filters
+ */
+ function getFilters();
+
+ /**
+ * Returns a list of tests to add to the existing list.
+ *
+ * @return array An array of tests
+ */
+ function getTests();
+
+ /**
+ * Returns a list of functions to add to the existing list.
+ *
+ * @return array An array of functions
+ */
+ function getFunctions();
+
+ /**
+ * Returns a list of operators to add to the existing list.
+ *
+ * @return array An array of operators
+ */
+ function getOperators();
+
+ /**
+ * Returns a list of global variables to add to the existing list.
+ *
+ * @return array An array of global variables
+ *
+ * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead
+ */
+ function getGlobals();
+
+ /**
+ * Returns the name of the extension.
+ *
+ * @return string The extension name
+ */
+ function getName();
+ }
+
+To keep your extension class clean and lean, it can inherit from the built-in
+``Twig_Extension`` class instead of implementing the whole interface. That
+way, you just need to implement the ``getName()`` method as the
+``Twig_Extension`` provides empty implementations for all other methods.
+
+The ``getName()`` method must return a unique identifier for your extension.
+
+Now, with this information in mind, let's create the most basic extension
+possible::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getName()
+ {
+ return 'project';
+ }
+ }
+
+.. note::
+
+ Of course, this extension does nothing for now. We will customize it in
+ the next sections.
+
+Twig does not care where you save your extension on the filesystem, as all
+extensions must be registered explicitly to be available in your templates.
+
+You can register an extension by using the ``addExtension()`` method on your
+main ``Environment`` object::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addExtension(new Project_Twig_Extension());
+
+.. tip::
+
+ The bundled extensions are great examples of how extensions work.
+
+Globals
+~~~~~~~
+
+Global variables can be registered in an extension via the ``getGlobals()``
+method::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getGlobals()
+ {
+ return array(
+ 'text' => new Text(),
+ );
+ }
+
+ // ...
+ }
+
+Functions
+~~~~~~~~~
+
+Functions can be registered in an extension via the ``getFunctions()``
+method::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getFunctions()
+ {
+ return array(
+ new Twig_SimpleFunction('lipsum', 'generate_lipsum'),
+ );
+ }
+
+ // ...
+ }
+
+Filters
+~~~~~~~
+
+To add a filter to an extension, you need to override the ``getFilters()``
+method. This method must return an array of filters to add to the Twig
+environment::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getFilters()
+ {
+ return array(
+ new Twig_SimpleFilter('rot13', 'str_rot13'),
+ );
+ }
+
+ // ...
+ }
+
+Tags
+~~~~
+
+Adding a tag in an extension can be done by overriding the
+``getTokenParsers()`` method. This method must return an array of tags to add
+to the Twig environment::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getTokenParsers()
+ {
+ return array(new Project_Set_TokenParser());
+ }
+
+ // ...
+ }
+
+In the above code, we have added a single new tag, defined by the
+``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is
+responsible for parsing the tag and compiling it to PHP.
+
+Operators
+~~~~~~~~~
+
+The ``getOperators()`` methods lets you add new operators. Here is how to add
+``!``, ``||``, and ``&&`` operators::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getOperators()
+ {
+ return array(
+ array(
+ '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
+ ),
+ array(
+ '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
+ '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
+ ),
+ );
+ }
+
+ // ...
+ }
+
+Tests
+~~~~~
+
+The ``getTests()`` method lets you add new test functions::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getTests()
+ {
+ return array(
+ new Twig_SimpleTest('even', 'twig_test_even'),
+ );
+ }
+
+ // ...
+ }
+
+Overloading
+-----------
+
+To overload an already defined filter, test, operator, global variable, or
+function, re-define it in an extension and register it **as late as
+possible** (order matters)::
+
+ class MyCoreExtension extends Twig_Extension
+ {
+ public function getFilters()
+ {
+ return array(
+ new Twig_SimpleFilter('date', array($this, 'dateFilter')),
+ );
+ }
+
+ public function dateFilter($timestamp, $format = 'F j, Y H:i')
+ {
+ // do something different from the built-in date filter
+ }
+
+ public function getName()
+ {
+ return 'project';
+ }
+ }
+
+ $twig = new Twig_Environment($loader);
+ $twig->addExtension(new MyCoreExtension());
+
+Here, we have overloaded the built-in ``date`` filter with a custom one.
+
+If you do the same on the Twig_Environment itself, beware that it takes
+precedence over any other registered extensions::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addFilter(new Twig_SimpleFilter('date', function ($timestamp, $format = 'F j, Y H:i') {
+ // do something different from the built-in date filter
+ }));
+ // the date filter will come from the above registration, not
+ // from the registered extension below
+ $twig->addExtension(new MyCoreExtension());
+
+.. caution::
+
+ Note that overloading the built-in Twig elements is not recommended as it
+ might be confusing.
+
+Testing an Extension
+--------------------
+
+Functional Tests
+~~~~~~~~~~~~~~~~
+
+You can create functional tests for extensions simply by creating the
+following file structure in your test directory::
+
+ Fixtures/
+ filters/
+ foo.test
+ bar.test
+ functions/
+ foo.test
+ bar.test
+ tags/
+ foo.test
+ bar.test
+ IntegrationTest.php
+
+The ``IntegrationTest.php`` file should look like this::
+
+ class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
+ {
+ public function getExtensions()
+ {
+ return array(
+ new Project_Twig_Extension1(),
+ new Project_Twig_Extension2(),
+ );
+ }
+
+ public function getFixturesDir()
+ {
+ return dirname(__FILE__).'/Fixtures/';
+ }
+ }
+
+Fixtures examples can be found within the Twig repository
+`tests/Twig/Fixtures`_ directory.
+
+Node Tests
+~~~~~~~~~~
+
+Testing the node visitors can be complex, so extend your test cases from
+``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository
+`tests/Twig/Node`_ directory.
+
+.. _`rot13`: http://www.php.net/manual/en/function.str-rot13.php
+.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures
+.. _`tests/Twig/Node`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node
diff --git a/plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst b/plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst
new file mode 100644
index 00000000..2ef6bfde
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst
@@ -0,0 +1,887 @@
+Extending Twig
+==============
+
+.. caution::
+
+ This section describes how to extends Twig for versions **older than
+ 1.12**. If you are using a newer version, read the :doc:`newer`
+ chapter instead.
+
+Twig can be extended in many ways; you can add extra tags, filters, tests,
+operators, global variables, and functions. You can even extend the parser
+itself with node visitors.
+
+.. note::
+
+ The first section of this chapter describes how to extend Twig easily. If
+ you want to reuse your changes in different projects or if you want to
+ share them with others, you should then create an extension as described
+ in the following section.
+
+.. caution::
+
+ When extending Twig by calling methods on the Twig environment instance,
+ Twig won't be able to recompile your templates when the PHP code is
+ updated. To see your changes in real-time, either disable template caching
+ or package your code into an extension (see the next section of this
+ chapter).
+
+Before extending Twig, you must understand the differences between all the
+different possible extension points and when to use them.
+
+First, remember that Twig has two main language constructs:
+
+* ``{{ }}``: used to print the result of an expression evaluation;
+
+* ``{% %}``: used to execute statements.
+
+To understand why Twig exposes so many extension points, let's see how to
+implement a *Lorem ipsum* generator (it needs to know the number of words to
+generate).
+
+You can use a ``lipsum`` *tag*:
+
+.. code-block:: jinja
+
+ {% lipsum 40 %}
+
+That works, but using a tag for ``lipsum`` is not a good idea for at least
+three main reasons:
+
+* ``lipsum`` is not a language construct;
+* The tag outputs something;
+* The tag is not flexible as you cannot use it in an expression:
+
+ .. code-block:: jinja
+
+ {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }}
+
+In fact, you rarely need to create tags; and that's good news because tags are
+the most complex extension point of Twig.
+
+Now, let's use a ``lipsum`` *filter*:
+
+.. code-block:: jinja
+
+ {{ 40|lipsum }}
+
+Again, it works, but it looks weird. A filter transforms the passed value to
+something else but here we use the value to indicate the number of words to
+generate (so, ``40`` is an argument of the filter, not the value we want to
+transform).
+
+Next, let's use a ``lipsum`` *function*:
+
+.. code-block:: jinja
+
+ {{ lipsum(40) }}
+
+Here we go. For this specific example, the creation of a function is the
+extension point to use. And you can use it anywhere an expression is accepted:
+
+.. code-block:: jinja
+
+ {{ 'some text' ~ ipsum(40) ~ 'some more text' }}
+
+ {% set ipsum = ipsum(40) %}
+
+Last but not the least, you can also use a *global* object with a method able
+to generate lorem ipsum text:
+
+.. code-block:: jinja
+
+ {{ text.lipsum(40) }}
+
+As a rule of thumb, use functions for frequently used features and global
+objects for everything else.
+
+Keep in mind the following when you want to extend Twig:
+
+========== ========================== ========== =========================
+What? Implementation difficulty? How often? When?
+========== ========================== ========== =========================
+*macro* trivial frequent Content generation
+*global* trivial frequent Helper object
+*function* trivial frequent Content generation
+*filter* trivial frequent Value transformation
+*tag* complex rare DSL language construct
+*test* trivial rare Boolean decision
+*operator* trivial rare Values transformation
+========== ========================== ========== =========================
+
+Globals
+-------
+
+A global variable is like any other template variable, except that it's
+available in all templates and macros::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addGlobal('text', new Text());
+
+You can then use the ``text`` variable anywhere in a template:
+
+.. code-block:: jinja
+
+ {{ text.lipsum(40) }}
+
+Filters
+-------
+
+A filter is a regular PHP function or an object method that takes the left
+side of the filter (before the pipe ``|``) as first argument and the extra
+arguments passed to the filter (within parentheses ``()``) as extra arguments.
+
+Defining a filter is as easy as associating the filter name with a PHP
+callable. For instance, let's say you have the following code in a template:
+
+.. code-block:: jinja
+
+ {{ 'TWIG'|lower }}
+
+When compiling this template to PHP, Twig looks for the PHP callable
+associated with the ``lower`` filter. The ``lower`` filter is a built-in Twig
+filter, and it is simply mapped to the PHP ``strtolower()`` function. After
+compilation, the generated PHP code is roughly equivalent to:
+
+.. code-block:: html+php
+
+
+
+As you can see, the ``'TWIG'`` string is passed as a first argument to the PHP
+function.
+
+A filter can also take extra arguments like in the following example:
+
+.. code-block:: jinja
+
+ {{ now|date('d/m/Y') }}
+
+In this case, the extra arguments are passed to the function after the main
+argument, and the compiled code is equivalent to:
+
+.. code-block:: html+php
+
+
+
+Let's see how to create a new filter.
+
+In this section, we will create a ``rot13`` filter, which should return the
+`rot13`_ transformation of a string. Here is an example of its usage and the
+expected output:
+
+.. code-block:: jinja
+
+ {{ "Twig"|rot13 }}
+
+ {# should displays Gjvt #}
+
+Adding a filter is as simple as calling the ``addFilter()`` method on the
+``Twig_Environment`` instance::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addFilter('rot13', new Twig_Filter_Function('str_rot13'));
+
+The second argument of ``addFilter()`` is an instance of ``Twig_Filter``.
+Here, we use ``Twig_Filter_Function`` as the filter is a PHP function. The
+first argument passed to the ``Twig_Filter_Function`` constructor is the name
+of the PHP function to call, here ``str_rot13``, a native PHP function.
+
+Let's say I now want to be able to add a prefix before the converted string:
+
+.. code-block:: jinja
+
+ {{ "Twig"|rot13('prefix_') }}
+
+ {# should displays prefix_Gjvt #}
+
+As the PHP ``str_rot13()`` function does not support this requirement, let's
+create a new PHP function::
+
+ function project_compute_rot13($string, $prefix = '')
+ {
+ return $prefix.str_rot13($string);
+ }
+
+As you can see, the ``prefix`` argument of the filter is passed as an extra
+argument to the ``project_compute_rot13()`` function.
+
+Adding this filter is as easy as before::
+
+ $twig->addFilter('rot13', new Twig_Filter_Function('project_compute_rot13'));
+
+For better encapsulation, a filter can also be defined as a static method of a
+class. The ``Twig_Filter_Function`` class can also be used to register such
+static methods as filters::
+
+ $twig->addFilter('rot13', new Twig_Filter_Function('SomeClass::rot13Filter'));
+
+.. tip::
+
+ In an extension, you can also define a filter as a static method of the
+ extension class.
+
+Environment aware Filters
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``Twig_Filter`` classes take options as their last argument. For instance,
+if you want access to the current environment instance in your filter, set the
+``needs_environment`` option to ``true``::
+
+ $filter = new Twig_Filter_Function('str_rot13', array('needs_environment' => true));
+
+Twig will then pass the current environment as the first argument to the
+filter call::
+
+ function twig_compute_rot13(Twig_Environment $env, $string)
+ {
+ // get the current charset for instance
+ $charset = $env->getCharset();
+
+ return str_rot13($string);
+ }
+
+Automatic Escaping
+~~~~~~~~~~~~~~~~~~
+
+If automatic escaping is enabled, the output of the filter may be escaped
+before printing. If your filter acts as an escaper (or explicitly outputs HTML
+or JavaScript code), you will want the raw output to be printed. In such a
+case, set the ``is_safe`` option::
+
+ $filter = new Twig_Filter_Function('nl2br', array('is_safe' => array('html')));
+
+Some filters may need to work on input that is already escaped or safe, for
+example when adding (safe) HTML tags to originally unsafe output. In such a
+case, set the ``pre_escape`` option to escape the input data before it is run
+through your filter::
+
+ $filter = new Twig_Filter_Function('somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
+
+Dynamic Filters
+~~~~~~~~~~~~~~~
+
+.. versionadded:: 1.5
+ Dynamic filters support was added in Twig 1.5.
+
+A filter name containing the special ``*`` character is a dynamic filter as
+the ``*`` can be any string::
+
+ $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
+
+ function twig_path($name, $arguments)
+ {
+ // ...
+ }
+
+The following filters will be matched by the above defined dynamic filter:
+
+* ``product_path``
+* ``category_path``
+
+A dynamic filter can define more than one dynamic parts::
+
+ $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
+
+ function twig_path($name, $suffix, $arguments)
+ {
+ // ...
+ }
+
+The filter will receive all dynamic part values before the normal filters
+arguments. For instance, a call to ``'foo'|a_path_b()`` will result in the
+following PHP call: ``twig_path('a', 'b', 'foo')``.
+
+Functions
+---------
+
+A function is a regular PHP function or an object method that can be called from
+templates.
+
+.. code-block:: jinja
+
+ {{ constant("DATE_W3C") }}
+
+When compiling this template to PHP, Twig looks for the PHP callable
+associated with the ``constant`` function. The ``constant`` function is a built-in Twig
+function, and it is simply mapped to the PHP ``constant()`` function. After
+compilation, the generated PHP code is roughly equivalent to:
+
+.. code-block:: html+php
+
+
+
+Adding a function is similar to adding a filter. This can be done by calling the
+``addFunction()`` method on the ``Twig_Environment`` instance::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addFunction('functionName', new Twig_Function_Function('someFunction'));
+
+You can also expose extension methods as functions in your templates::
+
+ // $this is an object that implements Twig_ExtensionInterface.
+ $twig = new Twig_Environment($loader);
+ $twig->addFunction('otherFunction', new Twig_Function_Method($this, 'someMethod'));
+
+Functions also support ``needs_environment`` and ``is_safe`` parameters.
+
+Dynamic Functions
+~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 1.5
+ Dynamic functions support was added in Twig 1.5.
+
+A function name containing the special ``*`` character is a dynamic function
+as the ``*`` can be any string::
+
+ $twig->addFunction('*_path', new Twig_Function_Function('twig_path'));
+
+ function twig_path($name, $arguments)
+ {
+ // ...
+ }
+
+The following functions will be matched by the above defined dynamic function:
+
+* ``product_path``
+* ``category_path``
+
+A dynamic function can define more than one dynamic parts::
+
+ $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
+
+ function twig_path($name, $suffix, $arguments)
+ {
+ // ...
+ }
+
+The function will receive all dynamic part values before the normal functions
+arguments. For instance, a call to ``a_path_b('foo')`` will result in the
+following PHP call: ``twig_path('a', 'b', 'foo')``.
+
+Tags
+----
+
+One of the most exciting feature of a template engine like Twig is the
+possibility to define new language constructs. This is also the most complex
+feature as you need to understand how Twig's internals work.
+
+Let's create a simple ``set`` tag that allows the definition of simple
+variables from within a template. The tag can be used like follows:
+
+.. code-block:: jinja
+
+ {% set name = "value" %}
+
+ {{ name }}
+
+ {# should output value #}
+
+.. note::
+
+ The ``set`` tag is part of the Core extension and as such is always
+ available. The built-in version is slightly more powerful and supports
+ multiple assignments by default (cf. the template designers chapter for
+ more information).
+
+Three steps are needed to define a new tag:
+
+* Defining a Token Parser class (responsible for parsing the template code);
+
+* Defining a Node class (responsible for converting the parsed code to PHP);
+
+* Registering the tag.
+
+Registering a new tag
+~~~~~~~~~~~~~~~~~~~~~
+
+Adding a tag is as simple as calling the ``addTokenParser`` method on the
+``Twig_Environment`` instance::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addTokenParser(new Project_Set_TokenParser());
+
+Defining a Token Parser
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Now, let's see the actual code of this class::
+
+ class Project_Set_TokenParser extends Twig_TokenParser
+ {
+ public function parse(Twig_Token $token)
+ {
+ $lineno = $token->getLine();
+ $name = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();
+ $this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE, '=');
+ $value = $this->parser->getExpressionParser()->parseExpression();
+
+ $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+
+ return new Project_Set_Node($name, $value, $lineno, $this->getTag());
+ }
+
+ public function getTag()
+ {
+ return 'set';
+ }
+ }
+
+The ``getTag()`` method must return the tag we want to parse, here ``set``.
+
+The ``parse()`` method is invoked whenever the parser encounters a ``set``
+tag. It should return a ``Twig_Node`` instance that represents the node (the
+``Project_Set_Node`` calls creating is explained in the next section).
+
+The parsing process is simplified thanks to a bunch of methods you can call
+from the token stream (``$this->parser->getStream()``):
+
+* ``getCurrent()``: Gets the current token in the stream.
+
+* ``next()``: Moves to the next token in the stream, *but returns the old one*.
+
+* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether
+ the current token is of a particular type or value (or both). The value may be an
+ array of several possible values.
+
+* ``expect($type[, $value[, $message]])``: If the current token isn't of the given
+ type/value a syntax error is thrown. Otherwise, if the type and value are correct,
+ the token is returned and the stream moves to the next token.
+
+* ``look()``: Looks a the next token without consuming it.
+
+Parsing expressions is done by calling the ``parseExpression()`` like we did for
+the ``set`` tag.
+
+.. tip::
+
+ Reading the existing ``TokenParser`` classes is the best way to learn all
+ the nitty-gritty details of the parsing process.
+
+Defining a Node
+~~~~~~~~~~~~~~~
+
+The ``Project_Set_Node`` class itself is rather simple::
+
+ class Project_Set_Node extends Twig_Node
+ {
+ public function __construct($name, Twig_Node_Expression $value, $lineno, $tag = null)
+ {
+ parent::__construct(array('value' => $value), array('name' => $name), $lineno, $tag);
+ }
+
+ public function compile(Twig_Compiler $compiler)
+ {
+ $compiler
+ ->addDebugInfo($this)
+ ->write('$context[\''.$this->getAttribute('name').'\'] = ')
+ ->subcompile($this->getNode('value'))
+ ->raw(";\n")
+ ;
+ }
+ }
+
+The compiler implements a fluid interface and provides methods that helps the
+developer generate beautiful and readable PHP code:
+
+* ``subcompile()``: Compiles a node.
+
+* ``raw()``: Writes the given string as is.
+
+* ``write()``: Writes the given string by adding indentation at the beginning
+ of each line.
+
+* ``string()``: Writes a quoted string.
+
+* ``repr()``: Writes a PHP representation of a given value (see
+ ``Twig_Node_For`` for a usage example).
+
+* ``addDebugInfo()``: Adds the line of the original template file related to
+ the current node as a comment.
+
+* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a
+ usage example).
+
+* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a
+ usage example).
+
+.. _creating_extensions:
+
+Creating an Extension
+---------------------
+
+The main motivation for writing an extension is to move often used code into a
+reusable class like adding support for internationalization. An extension can
+define tags, filters, tests, operators, global variables, functions, and node
+visitors.
+
+Creating an extension also makes for a better separation of code that is
+executed at compilation time and code needed at runtime. As such, it makes
+your code faster.
+
+Most of the time, it is useful to create a single extension for your project,
+to host all the specific tags and filters you want to add to Twig.
+
+.. tip::
+
+ When packaging your code into an extension, Twig is smart enough to
+ recompile your templates whenever you make a change to it (when the
+ ``auto_reload`` is enabled).
+
+.. note::
+
+ Before writing your own extensions, have a look at the Twig official
+ extension repository: http://github.com/twigphp/Twig-extensions.
+
+An extension is a class that implements the following interface::
+
+ interface Twig_ExtensionInterface
+ {
+ /**
+ * Initializes the runtime environment.
+ *
+ * This is where you can load some file that contains filter functions for instance.
+ *
+ * @param Twig_Environment $environment The current Twig_Environment instance
+ */
+ function initRuntime(Twig_Environment $environment);
+
+ /**
+ * Returns the token parser instances to add to the existing list.
+ *
+ * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
+ */
+ function getTokenParsers();
+
+ /**
+ * Returns the node visitor instances to add to the existing list.
+ *
+ * @return array An array of Twig_NodeVisitorInterface instances
+ */
+ function getNodeVisitors();
+
+ /**
+ * Returns a list of filters to add to the existing list.
+ *
+ * @return array An array of filters
+ */
+ function getFilters();
+
+ /**
+ * Returns a list of tests to add to the existing list.
+ *
+ * @return array An array of tests
+ */
+ function getTests();
+
+ /**
+ * Returns a list of functions to add to the existing list.
+ *
+ * @return array An array of functions
+ */
+ function getFunctions();
+
+ /**
+ * Returns a list of operators to add to the existing list.
+ *
+ * @return array An array of operators
+ */
+ function getOperators();
+
+ /**
+ * Returns a list of global variables to add to the existing list.
+ *
+ * @return array An array of global variables
+ */
+ function getGlobals();
+
+ /**
+ * Returns the name of the extension.
+ *
+ * @return string The extension name
+ */
+ function getName();
+ }
+
+To keep your extension class clean and lean, it can inherit from the built-in
+``Twig_Extension`` class instead of implementing the whole interface. That
+way, you just need to implement the ``getName()`` method as the
+``Twig_Extension`` provides empty implementations for all other methods.
+
+The ``getName()`` method must return a unique identifier for your extension.
+
+Now, with this information in mind, let's create the most basic extension
+possible::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getName()
+ {
+ return 'project';
+ }
+ }
+
+.. note::
+
+ Of course, this extension does nothing for now. We will customize it in
+ the next sections.
+
+Twig does not care where you save your extension on the filesystem, as all
+extensions must be registered explicitly to be available in your templates.
+
+You can register an extension by using the ``addExtension()`` method on your
+main ``Environment`` object::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addExtension(new Project_Twig_Extension());
+
+Of course, you need to first load the extension file by either using
+``require_once()`` or by using an autoloader (see `spl_autoload_register()`_).
+
+.. tip::
+
+ The bundled extensions are great examples of how extensions work.
+
+Globals
+~~~~~~~
+
+Global variables can be registered in an extension via the ``getGlobals()``
+method::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getGlobals()
+ {
+ return array(
+ 'text' => new Text(),
+ );
+ }
+
+ // ...
+ }
+
+Functions
+~~~~~~~~~
+
+Functions can be registered in an extension via the ``getFunctions()``
+method::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getFunctions()
+ {
+ return array(
+ 'lipsum' => new Twig_Function_Function('generate_lipsum'),
+ );
+ }
+
+ // ...
+ }
+
+Filters
+~~~~~~~
+
+To add a filter to an extension, you need to override the ``getFilters()``
+method. This method must return an array of filters to add to the Twig
+environment::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getFilters()
+ {
+ return array(
+ 'rot13' => new Twig_Filter_Function('str_rot13'),
+ );
+ }
+
+ // ...
+ }
+
+As you can see in the above code, the ``getFilters()`` method returns an array
+where keys are the name of the filters (``rot13``) and the values the
+definition of the filter (``new Twig_Filter_Function('str_rot13')``).
+
+As seen in the previous chapter, you can also define filters as static methods
+on the extension class::
+
+$twig->addFilter('rot13', new Twig_Filter_Function('Project_Twig_Extension::rot13Filter'));
+
+You can also use ``Twig_Filter_Method`` instead of ``Twig_Filter_Function``
+when defining a filter to use a method::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getFilters()
+ {
+ return array(
+ 'rot13' => new Twig_Filter_Method($this, 'rot13Filter'),
+ );
+ }
+
+ public function rot13Filter($string)
+ {
+ return str_rot13($string);
+ }
+
+ // ...
+ }
+
+The first argument of the ``Twig_Filter_Method`` constructor is always
+``$this``, the current extension object. The second one is the name of the
+method to call.
+
+Using methods for filters is a great way to package your filter without
+polluting the global namespace. This also gives the developer more flexibility
+at the cost of a small overhead.
+
+Overriding default Filters
+..........................
+
+If some default core filters do not suit your needs, you can easily override
+them by creating your own extension. Just use the same names as the one you
+want to override::
+
+ class MyCoreExtension extends Twig_Extension
+ {
+ public function getFilters()
+ {
+ return array(
+ 'date' => new Twig_Filter_Method($this, 'dateFilter'),
+ // ...
+ );
+ }
+
+ public function dateFilter($timestamp, $format = 'F j, Y H:i')
+ {
+ return '...'.twig_date_format_filter($timestamp, $format);
+ }
+
+ public function getName()
+ {
+ return 'project';
+ }
+ }
+
+Here, we override the ``date`` filter with a custom one. Using this extension
+is as simple as registering the ``MyCoreExtension`` extension by calling the
+``addExtension()`` method on the environment instance::
+
+ $twig = new Twig_Environment($loader);
+ $twig->addExtension(new MyCoreExtension());
+
+Tags
+~~~~
+
+Adding a tag in an extension can be done by overriding the
+``getTokenParsers()`` method. This method must return an array of tags to add
+to the Twig environment::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getTokenParsers()
+ {
+ return array(new Project_Set_TokenParser());
+ }
+
+ // ...
+ }
+
+In the above code, we have added a single new tag, defined by the
+``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is
+responsible for parsing the tag and compiling it to PHP.
+
+Operators
+~~~~~~~~~
+
+The ``getOperators()`` methods allows to add new operators. Here is how to add
+``!``, ``||``, and ``&&`` operators::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getOperators()
+ {
+ return array(
+ array(
+ '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
+ ),
+ array(
+ '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
+ '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
+ ),
+ );
+ }
+
+ // ...
+ }
+
+Tests
+~~~~~
+
+The ``getTests()`` methods allows to add new test functions::
+
+ class Project_Twig_Extension extends Twig_Extension
+ {
+ public function getTests()
+ {
+ return array(
+ 'even' => new Twig_Test_Function('twig_test_even'),
+ );
+ }
+
+ // ...
+ }
+
+Testing an Extension
+--------------------
+
+.. versionadded:: 1.10
+ Support for functional tests was added in Twig 1.10.
+
+Functional Tests
+~~~~~~~~~~~~~~~~
+
+You can create functional tests for extensions simply by creating the
+following file structure in your test directory::
+
+ Fixtures/
+ filters/
+ foo.test
+ bar.test
+ functions/
+ foo.test
+ bar.test
+ tags/
+ foo.test
+ bar.test
+ IntegrationTest.php
+
+The ``IntegrationTest.php`` file should look like this::
+
+ class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
+ {
+ public function getExtensions()
+ {
+ return array(
+ new Project_Twig_Extension1(),
+ new Project_Twig_Extension2(),
+ );
+ }
+
+ public function getFixturesDir()
+ {
+ return dirname(__FILE__).'/Fixtures/';
+ }
+ }
+
+Fixtures examples can be found within the Twig repository
+`tests/Twig/Fixtures`_ directory.
+
+Node Tests
+~~~~~~~~~~
+
+Testing the node visitors can be complex, so extend your test cases from
+``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository
+`tests/Twig/Node`_ directory.
+
+.. _`spl_autoload_register()`: http://www.php.net/spl_autoload_register
+.. _`rot13`: http://www.php.net/manual/en/function.str-rot13.php
+.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures
+.. _`tests/Twig/Node`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node
diff --git a/plugins/twig/vendor/twig/twig/doc/api.rst b/plugins/twig/vendor/twig/twig/doc/api.rst
new file mode 100644
index 00000000..f367db07
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/api.rst
@@ -0,0 +1,552 @@
+Twig for Developers
+===================
+
+This chapter describes the API to Twig and not the template language. It will
+be most useful as reference to those implementing the template interface to
+the application and not those who are creating Twig templates.
+
+Basics
+------
+
+Twig uses a central object called the **environment** (of class
+``Twig_Environment``). Instances of this class are used to store the
+configuration and extensions, and are used to load templates from the file
+system or other locations.
+
+Most applications will create one ``Twig_Environment`` object on application
+initialization and use that to load templates. In some cases it's however
+useful to have multiple environments side by side, if different configurations
+are in use.
+
+The simplest way to configure Twig to load templates for your application
+looks roughly like this::
+
+ require_once '/path/to/lib/Twig/Autoloader.php';
+ Twig_Autoloader::register();
+
+ $loader = new Twig_Loader_Filesystem('/path/to/templates');
+ $twig = new Twig_Environment($loader, array(
+ 'cache' => '/path/to/compilation_cache',
+ ));
+
+This will create a template environment with the default settings and a loader
+that looks up the templates in the ``/path/to/templates/`` folder. Different
+loaders are available and you can also write your own if you want to load
+templates from a database or other resources.
+
+.. note::
+
+ Notice that the second argument of the environment is an array of options.
+ The ``cache`` option is a compilation cache directory, where Twig caches
+ the compiled templates to avoid the parsing phase for sub-sequent
+ requests. It is very different from the cache you might want to add for
+ the evaluated templates. For such a need, you can use any available PHP
+ cache library.
+
+To load a template from this environment you just have to call the
+``loadTemplate()`` method which then returns a ``Twig_Template`` instance::
+
+ $template = $twig->loadTemplate('index.html');
+
+To render the template with some variables, call the ``render()`` method::
+
+ echo $template->render(array('the' => 'variables', 'go' => 'here'));
+
+.. note::
+
+ The ``display()`` method is a shortcut to output the template directly.
+
+You can also load and render the template in one fell swoop::
+
+ echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here'));
+
+.. _environment_options:
+
+Environment Options
+-------------------
+
+When creating a new ``Twig_Environment`` instance, you can pass an array of
+options as the constructor second argument::
+
+ $twig = new Twig_Environment($loader, array('debug' => true));
+
+The following options are available:
+
+* ``debug`` *boolean*
+
+ When set to ``true``, the generated templates have a
+ ``__toString()`` method that you can use to display the generated nodes
+ (default to ``false``).
+
+* ``charset`` *string (default to ``utf-8``)*
+
+ The charset used by the templates.
+
+* ``base_template_class`` *string (default to ``Twig_Template``)*
+
+ The base template class to use for generated
+ templates.
+
+* ``cache`` *string|false*
+
+ An absolute path where to store the compiled templates, or
+ ``false`` to disable caching (which is the default).
+
+* ``auto_reload`` *boolean*
+
+ When developing with Twig, it's useful to recompile the
+ template whenever the source code changes. If you don't provide a value for
+ the ``auto_reload`` option, it will be determined automatically based on the
+ ``debug`` value.
+
+* ``strict_variables`` *boolean*
+
+ If set to ``false``, Twig will silently ignore invalid
+ variables (variables and or attributes/methods that do not exist) and
+ replace them with a ``null`` value. When set to ``true``, Twig throws an
+ exception instead (default to ``false``).
+
+* ``autoescape`` *string|boolean*
+
+ If set to ``true``, HTML auto-escaping will be enabled by
+ default for all templates (default to ``true``).
+
+ As of Twig 1.8, you can set the escaping strategy to use (``html``, ``js``,
+ ``false`` to disable).
+
+ As of Twig 1.9, you can set the escaping strategy to use (``css``, ``url``,
+ ``html_attr``, or a PHP callback that takes the template "filename" and must
+ return the escaping strategy to use -- the callback cannot be a function name
+ to avoid collision with built-in escaping strategies).
+
+ As of Twig 1.17, the ``filename`` escaping strategy determines the escaping
+ strategy to use for a template based on the template filename extension (this
+ strategy does not incur any overhead at runtime as auto-escaping is done at
+ compilation time.)
+
+* ``optimizations`` *integer*
+
+ A flag that indicates which optimizations to apply
+ (default to ``-1`` -- all optimizations are enabled; set it to ``0`` to
+ disable).
+
+Loaders
+-------
+
+Loaders are responsible for loading templates from a resource such as the file
+system.
+
+Compilation Cache
+~~~~~~~~~~~~~~~~~
+
+All template loaders can cache the compiled templates on the filesystem for
+future reuse. It speeds up Twig a lot as templates are only compiled once; and
+the performance boost is even larger if you use a PHP accelerator such as APC.
+See the ``cache`` and ``auto_reload`` options of ``Twig_Environment`` above
+for more information.
+
+Built-in Loaders
+~~~~~~~~~~~~~~~~
+
+Here is a list of the built-in loaders Twig provides:
+
+``Twig_Loader_Filesystem``
+..........................
+
+.. versionadded:: 1.10
+ The ``prependPath()`` and support for namespaces were added in Twig 1.10.
+
+``Twig_Loader_Filesystem`` loads templates from the file system. This loader
+can find templates in folders on the file system and is the preferred way to
+load them::
+
+ $loader = new Twig_Loader_Filesystem($templateDir);
+
+It can also look for templates in an array of directories::
+
+ $loader = new Twig_Loader_Filesystem(array($templateDir1, $templateDir2));
+
+With such a configuration, Twig will first look for templates in
+``$templateDir1`` and if they do not exist, it will fallback to look for them
+in the ``$templateDir2``.
+
+You can add or prepend paths via the ``addPath()`` and ``prependPath()``
+methods::
+
+ $loader->addPath($templateDir3);
+ $loader->prependPath($templateDir4);
+
+The filesystem loader also supports namespaced templates. This allows to group
+your templates under different namespaces which have their own template paths.
+
+When using the ``setPaths()``, ``addPath()``, and ``prependPath()`` methods,
+specify the namespace as the second argument (when not specified, these
+methods act on the "main" namespace)::
+
+ $loader->addPath($templateDir, 'admin');
+
+Namespaced templates can be accessed via the special
+``@namespace_name/template_path`` notation::
+
+ $twig->render('@admin/index.html', array());
+
+``Twig_Loader_Array``
+.....................
+
+``Twig_Loader_Array`` loads a template from a PHP array. It's passed an array
+of strings bound to template names::
+
+ $loader = new Twig_Loader_Array(array(
+ 'index.html' => 'Hello {{ name }}!',
+ ));
+ $twig = new Twig_Environment($loader);
+
+ echo $twig->render('index.html', array('name' => 'Fabien'));
+
+This loader is very useful for unit testing. It can also be used for small
+projects where storing all templates in a single PHP file might make sense.
+
+.. tip::
+
+ When using the ``Array`` or ``String`` loaders with a cache mechanism, you
+ should know that a new cache key is generated each time a template content
+ "changes" (the cache key being the source code of the template). If you
+ don't want to see your cache grows out of control, you need to take care
+ of clearing the old cache file by yourself.
+
+``Twig_Loader_Chain``
+.....................
+
+``Twig_Loader_Chain`` delegates the loading of templates to other loaders::
+
+ $loader1 = new Twig_Loader_Array(array(
+ 'base.html' => '{% block content %}{% endblock %}',
+ ));
+ $loader2 = new Twig_Loader_Array(array(
+ 'index.html' => '{% extends "base.html" %}{% block content %}Hello {{ name }}{% endblock %}',
+ 'base.html' => 'Will never be loaded',
+ ));
+
+ $loader = new Twig_Loader_Chain(array($loader1, $loader2));
+
+ $twig = new Twig_Environment($loader);
+
+When looking for a template, Twig will try each loader in turn and it will
+return as soon as the template is found. When rendering the ``index.html``
+template from the above example, Twig will load it with ``$loader2`` but the
+``base.html`` template will be loaded from ``$loader1``.
+
+``Twig_Loader_Chain`` accepts any loader that implements
+``Twig_LoaderInterface``.
+
+.. note::
+
+ You can also add loaders via the ``addLoader()`` method.
+
+Create your own Loader
+~~~~~~~~~~~~~~~~~~~~~~
+
+All loaders implement the ``Twig_LoaderInterface``::
+
+ interface Twig_LoaderInterface
+ {
+ /**
+ * Gets the source code of a template, given its name.
+ *
+ * @param string $name string The name of the template to load
+ *
+ * @return string The template source code
+ */
+ function getSource($name);
+
+ /**
+ * Gets the cache key to use for the cache for a given template name.
+ *
+ * @param string $name string The name of the template to load
+ *
+ * @return string The cache key
+ */
+ function getCacheKey($name);
+
+ /**
+ * Returns true if the template is still fresh.
+ *
+ * @param string $name The template name
+ * @param timestamp $time The last modification time of the cached template
+ */
+ function isFresh($name, $time);
+ }
+
+The ``isFresh()`` method must return ``true`` if the current cached template
+is still fresh, given the last modification time, or ``false`` otherwise.
+
+.. tip::
+
+ As of Twig 1.11.0, you can also implement ``Twig_ExistsLoaderInterface``
+ to make your loader faster when used with the chain loader.
+
+Using Extensions
+----------------
+
+Twig extensions are packages that add new features to Twig. Using an
+extension is as simple as using the ``addExtension()`` method::
+
+ $twig->addExtension(new Twig_Extension_Sandbox());
+
+Twig comes bundled with the following extensions:
+
+* *Twig_Extension_Core*: Defines all the core features of Twig.
+
+* *Twig_Extension_Escaper*: Adds automatic output-escaping and the possibility
+ to escape/unescape blocks of code.
+
+* *Twig_Extension_Sandbox*: Adds a sandbox mode to the default Twig
+ environment, making it safe to evaluate untrusted code.
+
+* *Twig_Extension_Profiler*: Enabled the built-in Twig profiler (as of Twig
+ 1.18).
+
+* *Twig_Extension_Optimizer*: Optimizes the node tree before compilation.
+
+The core, escaper, and optimizer extensions do not need to be added to the
+Twig environment, as they are registered by default.
+
+Built-in Extensions
+-------------------
+
+This section describes the features added by the built-in extensions.
+
+.. tip::
+
+ Read the chapter about extending Twig to learn how to create your own
+ extensions.
+
+Core Extension
+~~~~~~~~~~~~~~
+
+The ``core`` extension defines all the core features of Twig:
+
+* :doc:`Tags `;
+* :doc:`Filters `;
+* :doc:`Functions `;
+* :doc:`Tests `.
+
+Escaper Extension
+~~~~~~~~~~~~~~~~~
+
+The ``escaper`` extension adds automatic output escaping to Twig. It defines a
+tag, ``autoescape``, and a filter, ``raw``.
+
+When creating the escaper extension, you can switch on or off the global
+output escaping strategy::
+
+ $escaper = new Twig_Extension_Escaper('html');
+ $twig->addExtension($escaper);
+
+If set to ``html``, all variables in templates are escaped (using the ``html``
+escaping strategy), except those using the ``raw`` filter:
+
+.. code-block:: jinja
+
+ {{ article.to_html|raw }}
+
+You can also change the escaping mode locally by using the ``autoescape`` tag
+(see the :doc:`autoescape` doc for the syntax used before
+Twig 1.8):
+
+.. code-block:: jinja
+
+ {% autoescape 'html' %}
+ {{ var }}
+ {{ var|raw }} {# var won't be escaped #}
+ {{ var|escape }} {# var won't be double-escaped #}
+ {% endautoescape %}
+
+.. warning::
+
+ The ``autoescape`` tag has no effect on included files.
+
+The escaping rules are implemented as follows:
+
+* Literals (integers, booleans, arrays, ...) used in the template directly as
+ variables or filter arguments are never automatically escaped:
+
+ .. code-block:: jinja
+
+ {{ "Twig " }} {# won't be escaped #}
+
+ {% set text = "Twig " %}
+ {{ text }} {# will be escaped #}
+
+* Expressions which the result is always a literal or a variable marked safe
+ are never automatically escaped:
+
+ .. code-block:: jinja
+
+ {{ foo ? "Twig " : " Twig" }} {# won't be escaped #}
+
+ {% set text = "Twig " %}
+ {{ foo ? text : " Twig" }} {# will be escaped #}
+
+ {% set text = "Twig " %}
+ {{ foo ? text|raw : " Twig" }} {# won't be escaped #}
+
+ {% set text = "Twig " %}
+ {{ foo ? text|escape : " Twig" }} {# the result of the expression won't be escaped #}
+
+* Escaping is applied before printing, after any other filter is applied:
+
+ .. code-block:: jinja
+
+ {{ var|upper }} {# is equivalent to {{ var|upper|escape }} #}
+
+* The `raw` filter should only be used at the end of the filter chain:
+
+ .. code-block:: jinja
+
+ {{ var|raw|upper }} {# will be escaped #}
+
+ {{ var|upper|raw }} {# won't be escaped #}
+
+* Automatic escaping is not applied if the last filter in the chain is marked
+ safe for the current context (e.g. ``html`` or ``js``). ``escape`` and
+ ``escape('html')`` are marked safe for HTML, ``escape('js')`` is marked
+ safe for JavaScript, ``raw`` is marked safe for everything.
+
+ .. code-block:: jinja
+
+ {% autoescape 'js' %}
+ {{ var|escape('html') }} {# will be escaped for HTML and JavaScript #}
+ {{ var }} {# will be escaped for JavaScript #}
+ {{ var|escape('js') }} {# won't be double-escaped #}
+ {% endautoescape %}
+
+.. note::
+
+ Note that autoescaping has some limitations as escaping is applied on
+ expressions after evaluation. For instance, when working with
+ concatenation, ``{{ foo|raw ~ bar }}`` won't give the expected result as
+ escaping is applied on the result of the concatenation, not on the
+ individual variables (so, the ``raw`` filter won't have any effect here).
+
+Sandbox Extension
+~~~~~~~~~~~~~~~~~
+
+The ``sandbox`` extension can be used to evaluate untrusted code. Access to
+unsafe attributes and methods is prohibited. The sandbox security is managed
+by a policy instance. By default, Twig comes with one policy class:
+``Twig_Sandbox_SecurityPolicy``. This class allows you to white-list some
+tags, filters, properties, and methods::
+
+ $tags = array('if');
+ $filters = array('upper');
+ $methods = array(
+ 'Article' => array('getTitle', 'getBody'),
+ );
+ $properties = array(
+ 'Article' => array('title', 'body'),
+ );
+ $functions = array('range');
+ $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
+
+With the previous configuration, the security policy will only allow usage of
+the ``if`` tag, and the ``upper`` filter. Moreover, the templates will only be
+able to call the ``getTitle()`` and ``getBody()`` methods on ``Article``
+objects, and the ``title`` and ``body`` public properties. Everything else
+won't be allowed and will generate a ``Twig_Sandbox_SecurityError`` exception.
+
+The policy object is the first argument of the sandbox constructor::
+
+ $sandbox = new Twig_Extension_Sandbox($policy);
+ $twig->addExtension($sandbox);
+
+By default, the sandbox mode is disabled and should be enabled when including
+untrusted template code by using the ``sandbox`` tag:
+
+.. code-block:: jinja
+
+ {% sandbox %}
+ {% include 'user.html' %}
+ {% endsandbox %}
+
+You can sandbox all templates by passing ``true`` as the second argument of
+the extension constructor::
+
+ $sandbox = new Twig_Extension_Sandbox($policy, true);
+
+Profiler Extension
+~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 1.18
+ The Profile extension was added in Twig 1.18.
+
+The ``profiler`` extension enables a profiler for Twig templates; it should
+only be used on your development machines as it adds some overhead::
+
+ $profile = new Twig_Profiler_Profile();
+ $twig->addExtension(new Twig_Extension_Profiler($profile));
+
+ $dumper = new Twig_Profiler_Dumper_Text();
+ echo $dumper->dump($profile);
+
+A profile contains information about time and memory consumption for template,
+block, and macro executions.
+
+You can also dump the data in a `Blackfire.io `_
+compatible format::
+
+ $dumper = new Twig_Profiler_Dumper_Blackfire();
+ file_put_contents('/path/to/profile.prof', $dumper->dump($profile));
+
+Upload the profile to visualize it (create a `free account
+`_ first):
+
+.. code-block:: sh
+
+ blackfire --slot=7 upload /path/to/profile.prof
+
+Optimizer Extension
+~~~~~~~~~~~~~~~~~~~
+
+The ``optimizer`` extension optimizes the node tree before compilation::
+
+ $twig->addExtension(new Twig_Extension_Optimizer());
+
+By default, all optimizations are turned on. You can select the ones you want
+to enable by passing them to the constructor::
+
+ $optimizer = new Twig_Extension_Optimizer(Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR);
+
+ $twig->addExtension($optimizer);
+
+Twig supports the following optimizations:
+
+* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_ALL``, enables all optimizations
+ (this is the default value).
+* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_NONE``, disables all optimizations.
+ This reduces the compilation time, but it can increase the execution time
+ and the consumed memory.
+* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR``, optimizes the ``for`` tag by
+ removing the ``loop`` variable creation whenever possible.
+* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_RAW_FILTER``, removes the ``raw``
+ filter whenever possible.
+* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_VAR_ACCESS``, simplifies the creation
+ and access of variables in the compiled templates whenever possible.
+
+Exceptions
+----------
+
+Twig can throw exceptions:
+
+* ``Twig_Error``: The base exception for all errors.
+
+* ``Twig_Error_Syntax``: Thrown to tell the user that there is a problem with
+ the template syntax.
+
+* ``Twig_Error_Runtime``: Thrown when an error occurs at runtime (when a filter
+ does not exist for instance).
+
+* ``Twig_Error_Loader``: Thrown when an error occurs during template loading.
+
+* ``Twig_Sandbox_SecurityError``: Thrown when an unallowed tag, filter, or
+ method is called in a sandboxed template.
diff --git a/plugins/twig/vendor/twig/twig/doc/coding_standards.rst b/plugins/twig/vendor/twig/twig/doc/coding_standards.rst
new file mode 100644
index 00000000..f435df49
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/coding_standards.rst
@@ -0,0 +1,101 @@
+Coding Standards
+================
+
+When writing Twig templates, we recommend you to follow these official coding
+standards:
+
+* Put one (and only one) space after the start of a delimiter (``{{``, ``{%``,
+ and ``{#``) and before the end of a delimiter (``}}``, ``%}``, and ``#}``):
+
+ .. code-block:: jinja
+
+ {{ foo }}
+ {# comment #}
+ {% if foo %}{% endif %}
+
+ When using the whitespace control character, do not put any spaces between
+ it and the delimiter:
+
+ .. code-block:: jinja
+
+ {{- foo -}}
+ {#- comment -#}
+ {%- if foo -%}{%- endif -%}
+
+* Put one (and only one) space before and after the following operators:
+ comparison operators (``==``, ``!=``, ``<``, ``>``, ``>=``, ``<=``), math
+ operators (``+``, ``-``, ``/``, ``*``, ``%``, ``//``, ``**``), logic
+ operators (``not``, ``and``, ``or``), ``~``, ``is``, ``in``, and the ternary
+ operator (``?:``):
+
+ .. code-block:: jinja
+
+ {{ 1 + 2 }}
+ {{ foo ~ bar }}
+ {{ true ? true : false }}
+
+* Put one (and only one) space after the ``:`` sign in hashes and ``,`` in
+ arrays and hashes:
+
+ .. code-block:: jinja
+
+ {{ [1, 2, 3] }}
+ {{ {'foo': 'bar'} }}
+
+* Do not put any spaces after an opening parenthesis and before a closing
+ parenthesis in expressions:
+
+ .. code-block:: jinja
+
+ {{ 1 + (2 * 3) }}
+
+* Do not put any spaces before and after string delimiters:
+
+ .. code-block:: jinja
+
+ {{ 'foo' }}
+ {{ "foo" }}
+
+* Do not put any spaces before and after the following operators: ``|``,
+ ``.``, ``..``, ``[]``:
+
+ .. code-block:: jinja
+
+ {{ foo|upper|lower }}
+ {{ user.name }}
+ {{ user[name] }}
+ {% for i in 1..12 %}{% endfor %}
+
+* Do not put any spaces before and after the parenthesis used for filter and
+ function calls:
+
+ .. code-block:: jinja
+
+ {{ foo|default('foo') }}
+ {{ range(1..10) }}
+
+* Do not put any spaces before and after the opening and the closing of arrays
+ and hashes:
+
+ .. code-block:: jinja
+
+ {{ [1, 2, 3] }}
+ {{ {'foo': 'bar'} }}
+
+* Use lower cased and underscored variable names:
+
+ .. code-block:: jinja
+
+ {% set foo = 'foo' %}
+ {% set foo_bar = 'foo' %}
+
+* Indent your code inside tags (use the same indentation as the one used for
+ the target language of the rendered template):
+
+ .. code-block:: jinja
+
+ {% block foo %}
+ {% if true %}
+ true
+ {% endif %}
+ {% endblock %}
diff --git a/plugins/twig/vendor/twig/twig/doc/deprecated.rst b/plugins/twig/vendor/twig/twig/doc/deprecated.rst
new file mode 100644
index 00000000..d31f1dd3
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/deprecated.rst
@@ -0,0 +1,162 @@
+Deprecated Features
+===================
+
+This document lists all deprecated features in Twig. Deprecated features are
+kept for backward compatibility and removed in the next major release (a
+feature that was deprecated in Twig 1.x is removed in Twig 2.0).
+
+Deprecation Notices
+-------------------
+
+As of Twig 1.21, Twig generates deprecation notices when a template uses
+deprecated features. See :ref:`deprecation-notices` for more information.
+
+Token Parsers
+-------------
+
+* As of Twig 1.x, the token parser broker sub-system is deprecated. The
+ following class and interface will be removed in 2.0:
+
+ * ``Twig_TokenParserBrokerInterface``
+ * ``Twig_TokenParserBroker``
+
+Extensions
+----------
+
+* As of Twig 1.x, the ability to remove an extension is deprecated and the
+ ``Twig_Environment::removeExtension()`` method will be removed in 2.0.
+
+* As of Twig 1.23, the ``Twig_ExtensionInterface::initRuntime()`` method is
+ deprecated. You have two options to avoid the deprecation notice: if you
+ implement this method to store the environment for your custom filters,
+ functions, or tests, use the ``needs_environment`` option instead; if you
+ have more complex needs, explicitly implement
+ ``Twig_Extension_InitRuntimeInterface`` (not recommended).
+
+* As of Twig 1.23, the ``Twig_ExtensionInterface::getGlobals()`` method is
+ deprecated. Implement ``Twig_Extension_GlobalsInterface`` to avoid
+ deprecation notices.
+
+PEAR
+----
+
+PEAR support has been discontinued in Twig 1.15.1, and no PEAR packages are
+provided anymore. Use Composer instead.
+
+Filters
+-------
+
+* As of Twig 1.x, use ``Twig_SimpleFilter`` to add a filter. The following
+ classes and interfaces will be removed in 2.0:
+
+ * ``Twig_FilterInterface``
+ * ``Twig_FilterCallableInterface``
+ * ``Twig_Filter``
+ * ``Twig_Filter_Function``
+ * ``Twig_Filter_Method``
+ * ``Twig_Filter_Node``
+
+* As of Twig 2.x, the ``Twig_SimpleFilter`` class is deprecated and will be
+ removed in Twig 3.x (use ``Twig_Filter`` instead). In Twig 2.x,
+ ``Twig_SimpleFilter`` is just an alias for ``Twig_Filter``.
+
+Functions
+---------
+
+* As of Twig 1.x, use ``Twig_SimpleFunction`` to add a function. The following
+ classes and interfaces will be removed in 2.0:
+
+ * ``Twig_FunctionInterface``
+ * ``Twig_FunctionCallableInterface``
+ * ``Twig_Function``
+ * ``Twig_Function_Function``
+ * ``Twig_Function_Method``
+ * ``Twig_Function_Node``
+
+* As of Twig 2.x, the ``Twig_SimpleFunction`` class is deprecated and will be
+ removed in Twig 3.x (use ``Twig_Function`` instead). In Twig 2.x,
+ ``Twig_SimpleFunction`` is just an alias for ``Twig_Function``.
+
+Tests
+-----
+
+* As of Twig 1.x, use ``Twig_SimpleTest`` to add a test. The following classes
+ and interfaces will be removed in 2.0:
+
+ * ``Twig_TestInterface``
+ * ``Twig_TestCallableInterface``
+ * ``Twig_Test``
+ * ``Twig_Test_Function``
+ * ``Twig_Test_Method``
+ * ``Twig_Test_Node``
+
+* As of Twig 2.x, the ``Twig_SimpleTest`` class is deprecated and will be
+ removed in Twig 3.x (use ``Twig_Test`` instead). In Twig 2.x,
+ ``Twig_SimpleTest`` is just an alias for ``Twig_Test``.
+
+* The ``sameas`` and ``divisibleby`` tests are deprecated in favor of ``same
+ as`` and ``divisible by`` respectively.
+
+Tags
+----
+
+* As of Twig 1.x, the ``raw`` tag is deprecated. You should use ``verbatim``
+ instead.
+
+Nodes
+-----
+
+* As of Twig 1.x, ``Node::toXml()`` is deprecated and will be removed in Twig
+ 2.0.
+
+Interfaces
+----------
+
+* As of Twig 2.x, the following interfaces are deprecated and empty (they will
+ be removed in Twig 3.0):
+
+* ``Twig_CompilerInterface`` (use ``Twig_Compiler`` instead)
+* ``Twig_LexerInterface`` (use ``Twig_Lexer`` instead)
+* ``Twig_NodeInterface`` (use ``Twig_Node`` instead)
+* ``Twig_ParserInterface`` (use ``Twig_Parser`` instead)
+* ``Twig_ExistsLoaderInterface`` (merged with ``Twig_LoaderInterface``)
+* ``Twig_TemplateInterface`` (use ``Twig_Template`` instead, and use
+ those constants Twig_Template::ANY_CALL, Twig_Template::ARRAY_CALL,
+ Twig_Template::METHOD_CALL)
+
+Loaders
+-------
+
+* As of Twig 1.x, ``Twig_Loader_String`` is deprecated and will be removed in
+ 2.0. You can render a string via ``Twig_Environment::createTemplate()``.
+
+Node Visitors
+-------------
+
+* Because of the removal of ``Twig_NodeInterface`` in 2.0, you need to extend
+ ``Twig_BaseNodeVisitor`` instead of implementing ``Twig_NodeVisitorInterface``
+ directly to make your node visitors compatible with both Twig 1.x and 2.x.
+
+Globals
+-------
+
+* As of Twig 2.x, the ability to register a global variable after the runtime
+ or the extensions have been initialized is not possible anymore (but
+ changing the value of an already registered global is possible).
+
+* As of Twig 1.x, using the ``_self`` global variable to get access to the
+ current ``Twig_Template`` instance is deprecated; most usages only need the
+ current template name, which will continue to work in Twig 2.0. In Twig 2.0,
+ ``_self`` returns the current template name instead of the current
+ ``Twig_Template`` instance.
+
+Miscellaneous
+-------------
+
+* As of Twig 1.x, ``Twig_Environment::clearTemplateCache()``, ``Twig_Environment::writeCacheFile()``,
+ ``Twig_Environment::clearCacheFiles()``, ``Twig_Environment::getCacheFilename()``, and
+ ``Twig_Environment::getTemplateClassPrefix()`` are deprecated and will be removed in 2.0.
+
+* As of Twig 1.x, ``Twig_Template::getEnvironment()`` and
+ ``Twig_TemplateInterface::getEnvironment()`` are deprecated and will be
+ removed in 2.0.
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/abs.rst b/plugins/twig/vendor/twig/twig/doc/filters/abs.rst
new file mode 100644
index 00000000..22fa59d0
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/abs.rst
@@ -0,0 +1,18 @@
+``abs``
+=======
+
+The ``abs`` filter returns the absolute value.
+
+.. code-block:: jinja
+
+ {# number = -5 #}
+
+ {{ number|abs }}
+
+ {# outputs 5 #}
+
+.. note::
+
+ Internally, Twig uses the PHP `abs`_ function.
+
+.. _`abs`: http://php.net/abs
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/batch.rst b/plugins/twig/vendor/twig/twig/doc/filters/batch.rst
new file mode 100644
index 00000000..f8b6fa9d
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/batch.rst
@@ -0,0 +1,51 @@
+``batch``
+=========
+
+.. versionadded:: 1.12.3
+ The ``batch`` filter was added in Twig 1.12.3.
+
+The ``batch`` filter "batches" items by returning a list of lists with the
+given number of items. A second parameter can be provided and used to fill in
+missing items:
+
+.. code-block:: jinja
+
+ {% set items = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] %}
+
+
+ {% for row in items|batch(3, 'No item') %}
+
+ {% for column in row %}
+
{{ column }}
+ {% endfor %}
+
+ {% endfor %}
+
+
+The above example will be rendered as:
+
+.. code-block:: jinja
+
+
+
+
a
+
b
+
c
+
+
+
d
+
e
+
f
+
+
+
g
+
No item
+
No item
+
+
+
+Arguments
+---------
+
+* ``size``: The size of the batch; fractional numbers will be rounded up
+* ``fill``: Used to fill in missing items
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst b/plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst
new file mode 100644
index 00000000..10546a1f
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst
@@ -0,0 +1,11 @@
+``capitalize``
+==============
+
+The ``capitalize`` filter capitalizes a value. The first character will be
+uppercase, all others lowercase:
+
+.. code-block:: jinja
+
+ {{ 'my first car'|capitalize }}
+
+ {# outputs 'My first car' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst b/plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst
new file mode 100644
index 00000000..f4ebe580
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst
@@ -0,0 +1,28 @@
+``convert_encoding``
+====================
+
+.. versionadded:: 1.4
+ The ``convert_encoding`` filter was added in Twig 1.4.
+
+The ``convert_encoding`` filter converts a string from one encoding to
+another. The first argument is the expected output charset and the second one
+is the input charset:
+
+.. code-block:: jinja
+
+ {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }}
+
+.. note::
+
+ This filter relies on the `iconv`_ or `mbstring`_ extension, so one of
+ them must be installed. In case both are installed, `mbstring`_ is used by
+ default (Twig before 1.8.1 uses `iconv`_ by default).
+
+Arguments
+---------
+
+* ``to``: The output charset
+* ``from``: The input charset
+
+.. _`iconv`: http://php.net/iconv
+.. _`mbstring`: http://php.net/mbstring
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/date.rst b/plugins/twig/vendor/twig/twig/doc/filters/date.rst
new file mode 100644
index 00000000..c86d42ba
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/date.rst
@@ -0,0 +1,94 @@
+``date``
+========
+
+.. versionadded:: 1.1
+ The timezone support has been added in Twig 1.1.
+
+.. versionadded:: 1.5
+ The default date format support has been added in Twig 1.5.
+
+.. versionadded:: 1.6.1
+ The default timezone support has been added in Twig 1.6.1.
+
+.. versionadded:: 1.11.0
+ The introduction of the false value for the timezone was introduced in Twig 1.11.0
+
+The ``date`` filter formats a date to a given format:
+
+.. code-block:: jinja
+
+ {{ post.published_at|date("m/d/Y") }}
+
+The format specifier is the same as supported by `date`_,
+except when the filtered data is of type `DateInterval`_, when the format must conform to
+`DateInterval::format`_ instead.
+
+The ``date`` filter accepts strings (it must be in a format supported by the
+`strtotime`_ function), `DateTime`_ instances, or `DateInterval`_ instances. For
+instance, to display the current date, filter the word "now":
+
+.. code-block:: jinja
+
+ {{ "now"|date("m/d/Y") }}
+
+To escape words and characters in the date format use ``\\`` in front of each
+character:
+
+.. code-block:: jinja
+
+ {{ post.published_at|date("F jS \\a\\t g:ia") }}
+
+If the value passed to the ``date`` filter is ``null``, it will return the
+current date by default. If an empty string is desired instead of the current
+date, use a ternary operator:
+
+.. code-block:: jinja
+
+ {{ post.published_at is empty ? "" : post.published_at|date("m/d/Y") }}
+
+If no format is provided, Twig will use the default one: ``F j, Y H:i``. This
+default can be easily changed by calling the ``setDateFormat()`` method on the
+``core`` extension instance. The first argument is the default format for
+dates and the second one is the default format for date intervals:
+
+.. code-block:: php
+
+ $twig = new Twig_Environment($loader);
+ $twig->getExtension('core')->setDateFormat('d/m/Y', '%d days');
+
+Timezone
+--------
+
+By default, the date is displayed by applying the default timezone (the one
+specified in php.ini or declared in Twig -- see below), but you can override
+it by explicitly specifying a timezone:
+
+.. code-block:: jinja
+
+ {{ post.published_at|date("m/d/Y", "Europe/Paris") }}
+
+If the date is already a DateTime object, and if you want to keep its current
+timezone, pass ``false`` as the timezone value:
+
+.. code-block:: jinja
+
+ {{ post.published_at|date("m/d/Y", false) }}
+
+The default timezone can also be set globally by calling ``setTimezone()``:
+
+.. code-block:: php
+
+ $twig = new Twig_Environment($loader);
+ $twig->getExtension('core')->setTimezone('Europe/Paris');
+
+Arguments
+---------
+
+* ``format``: The date format
+* ``timezone``: The date timezone
+
+.. _`strtotime`: http://www.php.net/strtotime
+.. _`DateTime`: http://www.php.net/DateTime
+.. _`DateInterval`: http://www.php.net/DateInterval
+.. _`date`: http://www.php.net/date
+.. _`DateInterval::format`: http://www.php.net/DateInterval.format
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst b/plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst
new file mode 100644
index 00000000..add40b56
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst
@@ -0,0 +1,23 @@
+``date_modify``
+===============
+
+.. versionadded:: 1.9.0
+ The date_modify filter has been added in Twig 1.9.0.
+
+The ``date_modify`` filter modifies a date with a given modifier string:
+
+.. code-block:: jinja
+
+ {{ post.published_at|date_modify("+1 day")|date("m/d/Y") }}
+
+The ``date_modify`` filter accepts strings (it must be in a format supported
+by the `strtotime`_ function) or `DateTime`_ instances. You can easily combine
+it with the :doc:`date` filter for formatting.
+
+Arguments
+---------
+
+* ``modifier``: The modifier
+
+.. _`strtotime`: http://www.php.net/strtotime
+.. _`DateTime`: http://www.php.net/DateTime
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/default.rst b/plugins/twig/vendor/twig/twig/doc/filters/default.rst
new file mode 100644
index 00000000..641ac6e7
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/default.rst
@@ -0,0 +1,33 @@
+``default``
+===========
+
+The ``default`` filter returns the passed default value if the value is
+undefined or empty, otherwise the value of the variable:
+
+.. code-block:: jinja
+
+ {{ var|default('var is not defined') }}
+
+ {{ var.foo|default('foo item on var is not defined') }}
+
+ {{ var['foo']|default('foo item on var is not defined') }}
+
+ {{ ''|default('passed var is empty') }}
+
+When using the ``default`` filter on an expression that uses variables in some
+method calls, be sure to use the ``default`` filter whenever a variable can be
+undefined:
+
+.. code-block:: jinja
+
+ {{ var.method(foo|default('foo'))|default('foo') }}
+
+.. note::
+
+ Read the documentation for the :doc:`defined<../tests/defined>` and
+ :doc:`empty<../tests/empty>` tests to learn more about their semantics.
+
+Arguments
+---------
+
+* ``default``: The default value
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/escape.rst b/plugins/twig/vendor/twig/twig/doc/filters/escape.rst
new file mode 100644
index 00000000..fc9771ac
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/escape.rst
@@ -0,0 +1,116 @@
+``escape``
+==========
+
+.. versionadded:: 1.9.0
+ The ``css``, ``url``, and ``html_attr`` strategies were added in Twig
+ 1.9.0.
+
+.. versionadded:: 1.14.0
+ The ability to define custom escapers was added in Twig 1.14.0.
+
+The ``escape`` filter escapes a string for safe insertion into the final
+output. It supports different escaping strategies depending on the template
+context.
+
+By default, it uses the HTML escaping strategy:
+
+.. code-block:: jinja
+
+ {{ user.username|escape }}
+
+For convenience, the ``e`` filter is defined as an alias:
+
+.. code-block:: jinja
+
+ {{ user.username|e }}
+
+The ``escape`` filter can also be used in other contexts than HTML thanks to
+an optional argument which defines the escaping strategy to use:
+
+.. code-block:: jinja
+
+ {{ user.username|e }}
+ {# is equivalent to #}
+ {{ user.username|e('html') }}
+
+And here is how to escape variables included in JavaScript code:
+
+.. code-block:: jinja
+
+ {{ user.username|escape('js') }}
+ {{ user.username|e('js') }}
+
+The ``escape`` filter supports the following escaping strategies:
+
+* ``html``: escapes a string for the **HTML body** context.
+
+* ``js``: escapes a string for the **JavaScript context**.
+
+* ``css``: escapes a string for the **CSS context**. CSS escaping can be
+ applied to any string being inserted into CSS and escapes everything except
+ alphanumerics.
+
+* ``url``: escapes a string for the **URI or parameter contexts**. This should
+ not be used to escape an entire URI; only a subcomponent being inserted.
+
+* ``html_attr``: escapes a string for the **HTML attribute** context.
+
+.. note::
+
+ Internally, ``escape`` uses the PHP native `htmlspecialchars`_ function
+ for the HTML escaping strategy.
+
+.. caution::
+
+ When using automatic escaping, Twig tries to not double-escape a variable
+ when the automatic escaping strategy is the same as the one applied by the
+ escape filter; but that does not work when using a variable as the
+ escaping strategy:
+
+ .. code-block:: jinja
+
+ {% set strategy = 'html' %}
+
+ {% autoescape 'html' %}
+ {{ var|escape('html') }} {# won't be double-escaped #}
+ {{ var|escape(strategy) }} {# will be double-escaped #}
+ {% endautoescape %}
+
+ When using a variable as the escaping strategy, you should disable
+ automatic escaping:
+
+ .. code-block:: jinja
+
+ {% set strategy = 'html' %}
+
+ {% autoescape 'html' %}
+ {{ var|escape(strategy)|raw }} {# won't be double-escaped #}
+ {% endautoescape %}
+
+Custom Escapers
+---------------
+
+You can define custom escapers by calling the ``setEscaper()`` method on the
+``core`` extension instance. The first argument is the escaper name (to be
+used in the ``escape`` call) and the second one must be a valid PHP callable:
+
+.. code-block:: php
+
+ $twig = new Twig_Environment($loader);
+ $twig->getExtension('core')->setEscaper('csv', 'csv_escaper'));
+
+When called by Twig, the callable receives the Twig environment instance, the
+string to escape, and the charset.
+
+.. note::
+
+ Built-in escapers cannot be overridden mainly they should be considered as
+ the final implementation and also for better performance.
+
+Arguments
+---------
+
+* ``strategy``: The escaping strategy
+* ``charset``: The string charset
+
+.. _`htmlspecialchars`: http://php.net/htmlspecialchars
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/first.rst b/plugins/twig/vendor/twig/twig/doc/filters/first.rst
new file mode 100644
index 00000000..674c1f9e
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/first.rst
@@ -0,0 +1,25 @@
+``first``
+=========
+
+.. versionadded:: 1.12.2
+ The ``first`` filter was added in Twig 1.12.2.
+
+The ``first`` filter returns the first "element" of a sequence, a mapping, or
+a string:
+
+.. code-block:: jinja
+
+ {{ [1, 2, 3, 4]|first }}
+ {# outputs 1 #}
+
+ {{ { a: 1, b: 2, c: 3, d: 4 }|first }}
+ {# outputs 1 #}
+
+ {{ '1234'|first }}
+ {# outputs 1 #}
+
+.. note::
+
+ It also works with objects implementing the `Traversable`_ interface.
+
+.. _`Traversable`: http://php.net/manual/en/class.traversable.php
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/format.rst b/plugins/twig/vendor/twig/twig/doc/filters/format.rst
new file mode 100644
index 00000000..f8effd9a
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/format.rst
@@ -0,0 +1,16 @@
+``format``
+==========
+
+The ``format`` filter formats a given string by replacing the placeholders
+(placeholders follows the `sprintf`_ notation):
+
+.. code-block:: jinja
+
+ {{ "I like %s and %s."|format(foo, "bar") }}
+
+ {# outputs I like foo and bar
+ if the foo parameter equals to the foo string. #}
+
+.. _`sprintf`: http://www.php.net/sprintf
+
+.. seealso:: :doc:`replace`
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/index.rst b/plugins/twig/vendor/twig/twig/doc/filters/index.rst
new file mode 100644
index 00000000..8daa9611
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/index.rst
@@ -0,0 +1,37 @@
+Filters
+=======
+
+.. toctree::
+ :maxdepth: 1
+
+ abs
+ batch
+ capitalize
+ convert_encoding
+ date
+ date_modify
+ default
+ escape
+ first
+ format
+ join
+ json_encode
+ keys
+ last
+ length
+ lower
+ merge
+ nl2br
+ number_format
+ raw
+ replace
+ reverse
+ round
+ slice
+ sort
+ split
+ striptags
+ title
+ trim
+ upper
+ url_encode
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/join.rst b/plugins/twig/vendor/twig/twig/doc/filters/join.rst
new file mode 100644
index 00000000..2fab9452
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/join.rst
@@ -0,0 +1,23 @@
+``join``
+========
+
+The ``join`` filter returns a string which is the concatenation of the items
+of a sequence:
+
+.. code-block:: jinja
+
+ {{ [1, 2, 3]|join }}
+ {# returns 123 #}
+
+The separator between elements is an empty string per default, but you can
+define it with the optional first parameter:
+
+.. code-block:: jinja
+
+ {{ [1, 2, 3]|join('|') }}
+ {# outputs 1|2|3 #}
+
+Arguments
+---------
+
+* ``glue``: The separator
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst b/plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst
new file mode 100644
index 00000000..a39bb476
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst
@@ -0,0 +1,21 @@
+``json_encode``
+===============
+
+The ``json_encode`` filter returns the JSON representation of a value:
+
+.. code-block:: jinja
+
+ {{ data|json_encode() }}
+
+.. note::
+
+ Internally, Twig uses the PHP `json_encode`_ function.
+
+Arguments
+---------
+
+* ``options``: A bitmask of `json_encode options`_ (``{{
+ data|json_encode(constant('JSON_PRETTY_PRINT')) }}``)
+
+.. _`json_encode`: http://php.net/json_encode
+.. _`json_encode options`: http://www.php.net/manual/en/json.constants.php
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/keys.rst b/plugins/twig/vendor/twig/twig/doc/filters/keys.rst
new file mode 100644
index 00000000..e4f090c6
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/keys.rst
@@ -0,0 +1,11 @@
+``keys``
+========
+
+The ``keys`` filter returns the keys of an array. It is useful when you want to
+iterate over the keys of an array:
+
+.. code-block:: jinja
+
+ {% for key in array|keys %}
+ ...
+ {% endfor %}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/last.rst b/plugins/twig/vendor/twig/twig/doc/filters/last.rst
new file mode 100644
index 00000000..345b6573
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/last.rst
@@ -0,0 +1,25 @@
+``last``
+========
+
+.. versionadded:: 1.12.2
+ The ``last`` filter was added in Twig 1.12.2.
+
+The ``last`` filter returns the last "element" of a sequence, a mapping, or
+a string:
+
+.. code-block:: jinja
+
+ {{ [1, 2, 3, 4]|last }}
+ {# outputs 4 #}
+
+ {{ { a: 1, b: 2, c: 3, d: 4 }|last }}
+ {# outputs 4 #}
+
+ {{ '1234'|last }}
+ {# outputs 4 #}
+
+.. note::
+
+ It also works with objects implementing the `Traversable`_ interface.
+
+.. _`Traversable`: http://php.net/manual/en/class.traversable.php
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/length.rst b/plugins/twig/vendor/twig/twig/doc/filters/length.rst
new file mode 100644
index 00000000..1f783b3d
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/length.rst
@@ -0,0 +1,11 @@
+``length``
+==========
+
+The ``length`` filter returns the number of items of a sequence or mapping, or
+the length of a string:
+
+.. code-block:: jinja
+
+ {% if users|length > 10 %}
+ ...
+ {% endif %}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/lower.rst b/plugins/twig/vendor/twig/twig/doc/filters/lower.rst
new file mode 100644
index 00000000..ef9faa90
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/lower.rst
@@ -0,0 +1,10 @@
+``lower``
+=========
+
+The ``lower`` filter converts a value to lowercase:
+
+.. code-block:: jinja
+
+ {{ 'WELCOME'|lower }}
+
+ {# outputs 'welcome' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/merge.rst b/plugins/twig/vendor/twig/twig/doc/filters/merge.rst
new file mode 100644
index 00000000..88780dd6
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/merge.rst
@@ -0,0 +1,48 @@
+``merge``
+=========
+
+The ``merge`` filter merges an array with another array:
+
+.. code-block:: jinja
+
+ {% set values = [1, 2] %}
+
+ {% set values = values|merge(['apple', 'orange']) %}
+
+ {# values now contains [1, 2, 'apple', 'orange'] #}
+
+New values are added at the end of the existing ones.
+
+The ``merge`` filter also works on hashes:
+
+.. code-block:: jinja
+
+ {% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
+
+ {% set items = items|merge({ 'peugeot': 'car', 'renault': 'car' }) %}
+
+ {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car', 'renault': 'car' } #}
+
+For hashes, the merging process occurs on the keys: if the key does not
+already exist, it is added but if the key already exists, its value is
+overridden.
+
+.. tip::
+
+ If you want to ensure that some values are defined in an array (by given
+ default values), reverse the two elements in the call:
+
+ .. code-block:: jinja
+
+ {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
+
+ {% set items = { 'apple': 'unknown' }|merge(items) %}
+
+ {# items now contains { 'apple': 'fruit', 'orange': 'fruit' } #}
+
+.. note::
+
+ Internally, Twig uses the PHP `array_merge`_ function. It supports
+ Traversable objects by transforming those to arrays.
+
+.. _`array_merge`: http://php.net/array_merge
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst b/plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst
new file mode 100644
index 00000000..5c923e14
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst
@@ -0,0 +1,22 @@
+``nl2br``
+=========
+
+.. versionadded:: 1.5
+ The ``nl2br`` filter was added in Twig 1.5.
+
+The ``nl2br`` filter inserts HTML line breaks before all newlines in a string:
+
+.. code-block:: jinja
+
+ {{ "I like Twig.\nYou will like it too."|nl2br }}
+ {# outputs
+
+ I like Twig.
+ You will like it too.
+
+ #}
+
+.. note::
+
+ The ``nl2br`` filter pre-escapes the input before applying the
+ transformation.
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/number_format.rst b/plugins/twig/vendor/twig/twig/doc/filters/number_format.rst
new file mode 100644
index 00000000..3114e845
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/number_format.rst
@@ -0,0 +1,45 @@
+``number_format``
+=================
+
+.. versionadded:: 1.5
+ The ``number_format`` filter was added in Twig 1.5
+
+The ``number_format`` filter formats numbers. It is a wrapper around PHP's
+`number_format`_ function:
+
+.. code-block:: jinja
+
+ {{ 200.35|number_format }}
+
+You can control the number of decimal places, decimal point, and thousands
+separator using the additional arguments:
+
+.. code-block:: jinja
+
+ {{ 9800.333|number_format(2, '.', ',') }}
+
+If no formatting options are provided then Twig will use the default formatting
+options of:
+
+* 0 decimal places.
+* ``.`` as the decimal point.
+* ``,`` as the thousands separator.
+
+These defaults can be easily changed through the core extension:
+
+.. code-block:: php
+
+ $twig = new Twig_Environment($loader);
+ $twig->getExtension('core')->setNumberFormat(3, '.', ',');
+
+The defaults set for ``number_format`` can be over-ridden upon each call using the
+additional parameters.
+
+Arguments
+---------
+
+* ``decimal``: The number of decimal points to display
+* ``decimal_point``: The character(s) to use for the decimal point
+* ``thousand_sep``: The character(s) to use for the thousands separator
+
+.. _`number_format`: http://php.net/number_format
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/raw.rst b/plugins/twig/vendor/twig/twig/doc/filters/raw.rst
new file mode 100644
index 00000000..e5e5b12e
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/raw.rst
@@ -0,0 +1,36 @@
+``raw``
+=======
+
+The ``raw`` filter marks the value as being "safe", which means that in an
+environment with automatic escaping enabled this variable will not be escaped
+if ``raw`` is the last filter applied to it:
+
+.. code-block:: jinja
+
+ {% autoescape %}
+ {{ var|raw }} {# var won't be escaped #}
+ {% endautoescape %}
+
+.. note::
+
+ Be careful when using the ``raw`` filter inside expressions:
+
+ .. code-block:: jinja
+
+ {% autoescape %}
+ {% set hello = 'Hello' %}
+ {% set hola = 'Hola' %}
+
+ {{ false ? 'Hola' : hello|raw }}
+ does not render the same as
+ {{ false ? hola : hello|raw }}
+ but renders the same as
+ {{ (false ? hola : hello)|raw }}
+ {% endautoescape %}
+
+ The first ternary statement is not escaped: ``hello`` is marked as being
+ safe and Twig does not escape static values (see
+ :doc:`escape<../tags/autoescape>`). In the second ternary statement, even
+ if ``hello`` is marked as safe, ``hola`` remains unsafe and so is the whole
+ expression. The third ternary statement is marked as safe and the result is
+ not escaped.
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/replace.rst b/plugins/twig/vendor/twig/twig/doc/filters/replace.rst
new file mode 100644
index 00000000..1227957b
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/replace.rst
@@ -0,0 +1,19 @@
+``replace``
+===========
+
+The ``replace`` filter formats a given string by replacing the placeholders
+(placeholders are free-form):
+
+.. code-block:: jinja
+
+ {{ "I like %this% and %that%."|replace({'%this%': foo, '%that%': "bar"}) }}
+
+ {# outputs I like foo and bar
+ if the foo parameter equals to the foo string. #}
+
+Arguments
+---------
+
+* ``replace_pairs``: The placeholder values
+
+.. seealso:: :doc:`format`
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/reverse.rst b/plugins/twig/vendor/twig/twig/doc/filters/reverse.rst
new file mode 100644
index 00000000..76fd2c1a
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/reverse.rst
@@ -0,0 +1,47 @@
+``reverse``
+===========
+
+.. versionadded:: 1.6
+ Support for strings has been added in Twig 1.6.
+
+The ``reverse`` filter reverses a sequence, a mapping, or a string:
+
+.. code-block:: jinja
+
+ {% for user in users|reverse %}
+ ...
+ {% endfor %}
+
+ {{ '1234'|reverse }}
+
+ {# outputs 4321 #}
+
+.. tip::
+
+ For sequences and mappings, numeric keys are not preserved. To reverse
+ them as well, pass ``true`` as an argument to the ``reverse`` filter:
+
+ .. code-block:: jinja
+
+ {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse %}
+ {{ key }}: {{ value }}
+ {%- endfor %}
+
+ {# output: 0: c 1: b 2: a #}
+
+ {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse(true) %}
+ {{ key }}: {{ value }}
+ {%- endfor %}
+
+ {# output: 3: c 2: b 1: a #}
+
+.. note::
+
+ It also works with objects implementing the `Traversable`_ interface.
+
+Arguments
+---------
+
+* ``preserve_keys``: Preserve keys when reversing a mapping or a sequence.
+
+.. _`Traversable`: http://php.net/Traversable
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/round.rst b/plugins/twig/vendor/twig/twig/doc/filters/round.rst
new file mode 100644
index 00000000..2521cf16
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/round.rst
@@ -0,0 +1,37 @@
+``round``
+=========
+
+.. versionadded:: 1.15.0
+ The ``round`` filter was added in Twig 1.15.0.
+
+The ``round`` filter rounds a number to a given precision:
+
+.. code-block:: jinja
+
+ {{ 42.55|round }}
+ {# outputs 43 #}
+
+ {{ 42.55|round(1, 'floor') }}
+ {# outputs 42.5 #}
+
+The ``round`` filter takes two optional arguments; the first one specifies the
+precision (default is ``0``) and the second the rounding method (default is
+``common``):
+
+* ``common`` rounds either up or down (rounds the value up to precision decimal
+ places away from zero, when it is half way there -- making 1.5 into 2 and
+ -1.5 into -2);
+
+* ``ceil`` always rounds up;
+
+* ``floor`` always rounds down.
+
+.. note::
+
+ The ``//`` operator is equivalent to ``|round(0, 'floor')``.
+
+Arguments
+---------
+
+* ``precision``: The rounding precision
+* ``method``: The rounding method
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/slice.rst b/plugins/twig/vendor/twig/twig/doc/filters/slice.rst
new file mode 100644
index 00000000..70bf139e
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/slice.rst
@@ -0,0 +1,71 @@
+``slice``
+===========
+
+.. versionadded:: 1.6
+ The ``slice`` filter was added in Twig 1.6.
+
+The ``slice`` filter extracts a slice of a sequence, a mapping, or a string:
+
+.. code-block:: jinja
+
+ {% for i in [1, 2, 3, 4, 5]|slice(1, 2) %}
+ {# will iterate over 2 and 3 #}
+ {% endfor %}
+
+ {{ '12345'|slice(1, 2) }}
+
+ {# outputs 23 #}
+
+You can use any valid expression for both the start and the length:
+
+.. code-block:: jinja
+
+ {% for i in [1, 2, 3, 4, 5]|slice(start, length) %}
+ {# ... #}
+ {% endfor %}
+
+As syntactic sugar, you can also use the ``[]`` notation:
+
+.. code-block:: jinja
+
+ {% for i in [1, 2, 3, 4, 5][start:length] %}
+ {# ... #}
+ {% endfor %}
+
+ {{ '12345'[1:2] }} {# will display "23" #}
+
+ {# you can omit the first argument -- which is the same as 0 #}
+ {{ '12345'[:2] }} {# will display "12" #}
+
+ {# you can omit the last argument -- which will select everything till the end #}
+ {{ '12345'[2:] }} {# will display "345" #}
+
+The ``slice`` filter works as the `array_slice`_ PHP function for arrays and
+`mb_substr`_ for strings with a fallback to `substr`_.
+
+If the start is non-negative, the sequence will start at that start in the
+variable. If start is negative, the sequence will start that far from the end
+of the variable.
+
+If length is given and is positive, then the sequence will have up to that
+many elements in it. If the variable is shorter than the length, then only the
+available variable elements will be present. If length is given and is
+negative then the sequence will stop that many elements from the end of the
+variable. If it is omitted, then the sequence will have everything from offset
+up until the end of the variable.
+
+.. note::
+
+ It also works with objects implementing the `Traversable`_ interface.
+
+Arguments
+---------
+
+* ``start``: The start of the slice
+* ``length``: The size of the slice
+* ``preserve_keys``: Whether to preserve key or not (when the input is an array)
+
+.. _`Traversable`: http://php.net/manual/en/class.traversable.php
+.. _`array_slice`: http://php.net/array_slice
+.. _`mb_substr` : http://php.net/mb-substr
+.. _`substr`: http://php.net/substr
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/sort.rst b/plugins/twig/vendor/twig/twig/doc/filters/sort.rst
new file mode 100644
index 00000000..350207f8
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/sort.rst
@@ -0,0 +1,18 @@
+``sort``
+========
+
+The ``sort`` filter sorts an array:
+
+.. code-block:: jinja
+
+ {% for user in users|sort %}
+ ...
+ {% endfor %}
+
+.. note::
+
+ Internally, Twig uses the PHP `asort`_ function to maintain index
+ association. It supports Traversable objects by transforming
+ those to arrays.
+
+.. _`asort`: http://php.net/asort
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/split.rst b/plugins/twig/vendor/twig/twig/doc/filters/split.rst
new file mode 100644
index 00000000..bbc6d798
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/split.rst
@@ -0,0 +1,53 @@
+``split``
+=========
+
+.. versionadded:: 1.10.3
+ The ``split`` filter was added in Twig 1.10.3.
+
+The ``split`` filter splits a string by the given delimiter and returns a list
+of strings:
+
+.. code-block:: jinja
+
+ {% set foo = "one,two,three"|split(',') %}
+ {# foo contains ['one', 'two', 'three'] #}
+
+You can also pass a ``limit`` argument:
+
+ * If ``limit`` is positive, the returned array will contain a maximum of
+ limit elements with the last element containing the rest of string;
+
+ * If ``limit`` is negative, all components except the last -limit are
+ returned;
+
+ * If ``limit`` is zero, then this is treated as 1.
+
+.. code-block:: jinja
+
+ {% set foo = "one,two,three,four,five"|split(',', 3) %}
+ {# foo contains ['one', 'two', 'three,four,five'] #}
+
+If the ``delimiter`` is an empty string, then value will be split by equal
+chunks. Length is set by the ``limit`` argument (one character by default).
+
+.. code-block:: jinja
+
+ {% set foo = "123"|split('') %}
+ {# foo contains ['1', '2', '3'] #}
+
+ {% set bar = "aabbcc"|split('', 2) %}
+ {# bar contains ['aa', 'bb', 'cc'] #}
+
+.. note::
+
+ Internally, Twig uses the PHP `explode`_ or `str_split`_ (if delimiter is
+ empty) functions for string splitting.
+
+Arguments
+---------
+
+* ``delimiter``: The delimiter
+* ``limit``: The limit argument
+
+.. _`explode`: http://php.net/explode
+.. _`str_split`: http://php.net/str_split
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/striptags.rst b/plugins/twig/vendor/twig/twig/doc/filters/striptags.rst
new file mode 100644
index 00000000..72c6f252
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/striptags.rst
@@ -0,0 +1,15 @@
+``striptags``
+=============
+
+The ``striptags`` filter strips SGML/XML tags and replace adjacent whitespace
+by one space:
+
+.. code-block:: jinja
+
+ {{ some_html|striptags }}
+
+.. note::
+
+ Internally, Twig uses the PHP `strip_tags`_ function.
+
+.. _`strip_tags`: http://php.net/strip_tags
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/title.rst b/plugins/twig/vendor/twig/twig/doc/filters/title.rst
new file mode 100644
index 00000000..c5a318e8
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/title.rst
@@ -0,0 +1,11 @@
+``title``
+=========
+
+The ``title`` filter returns a titlecased version of the value. Words will
+start with uppercase letters, all remaining characters are lowercase:
+
+.. code-block:: jinja
+
+ {{ 'my first car'|title }}
+
+ {# outputs 'My First Car' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/trim.rst b/plugins/twig/vendor/twig/twig/doc/filters/trim.rst
new file mode 100644
index 00000000..4ddb2083
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/trim.rst
@@ -0,0 +1,29 @@
+``trim``
+========
+
+.. versionadded:: 1.6.2
+ The ``trim`` filter was added in Twig 1.6.2.
+
+The ``trim`` filter strips whitespace (or other characters) from the beginning
+and end of a string:
+
+.. code-block:: jinja
+
+ {{ ' I like Twig. '|trim }}
+
+ {# outputs 'I like Twig.' #}
+
+ {{ ' I like Twig.'|trim('.') }}
+
+ {# outputs ' I like Twig' #}
+
+.. note::
+
+ Internally, Twig uses the PHP `trim`_ function.
+
+Arguments
+---------
+
+* ``character_mask``: The characters to strip
+
+.. _`trim`: http://php.net/trim
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/upper.rst b/plugins/twig/vendor/twig/twig/doc/filters/upper.rst
new file mode 100644
index 00000000..561cebe3
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/upper.rst
@@ -0,0 +1,10 @@
+``upper``
+=========
+
+The ``upper`` filter converts a value to uppercase:
+
+.. code-block:: jinja
+
+ {{ 'welcome'|upper }}
+
+ {# outputs 'WELCOME' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst b/plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst
new file mode 100644
index 00000000..5944e59c
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst
@@ -0,0 +1,34 @@
+``url_encode``
+==============
+
+.. versionadded:: 1.12.3
+ Support for encoding an array as query string was added in Twig 1.12.3.
+
+.. versionadded:: 1.16.0
+ The ``raw`` argument was removed in Twig 1.16.0. Twig now always encodes
+ according to RFC 3986.
+
+The ``url_encode`` filter percent encodes a given string as URL segment
+or an array as query string:
+
+.. code-block:: jinja
+
+ {{ "path-seg*ment"|url_encode }}
+ {# outputs "path-seg%2Ament" #}
+
+ {{ "string with spaces"|url_encode }}
+ {# outputs "string%20with%20spaces" #}
+
+ {{ {'param': 'value', 'foo': 'bar'}|url_encode }}
+ {# outputs "param=value&foo=bar" #}
+
+.. note::
+
+ Internally, Twig uses the PHP `urlencode`_ (or `rawurlencode`_ if you pass
+ ``true`` as the first parameter) or the `http_build_query`_ function. Note
+ that as of Twig 1.16.0, ``urlencode`` **always** uses ``rawurlencode`` (the
+ ``raw`` argument was removed.)
+
+.. _`urlencode`: http://php.net/urlencode
+.. _`rawurlencode`: http://php.net/rawurlencode
+.. _`http_build_query`: http://php.net/http_build_query
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/attribute.rst b/plugins/twig/vendor/twig/twig/doc/functions/attribute.rst
new file mode 100644
index 00000000..ceba96b0
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/attribute.rst
@@ -0,0 +1,26 @@
+``attribute``
+=============
+
+.. versionadded:: 1.2
+ The ``attribute`` function was added in Twig 1.2.
+
+The ``attribute`` function can be used to access a "dynamic" attribute of a
+variable:
+
+.. code-block:: jinja
+
+ {{ attribute(object, method) }}
+ {{ attribute(object, method, arguments) }}
+ {{ attribute(array, item) }}
+
+In addition, the ``defined`` test can check for the existence of a dynamic
+attribute:
+
+.. code-block:: jinja
+
+ {{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}
+
+.. note::
+
+ The resolution algorithm is the same as the one used for the ``.``
+ notation, except that the item can be any valid expression.
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/block.rst b/plugins/twig/vendor/twig/twig/doc/functions/block.rst
new file mode 100644
index 00000000..fd571efb
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/block.rst
@@ -0,0 +1,15 @@
+``block``
+=========
+
+When a template uses inheritance and if you want to print a block multiple
+times, use the ``block`` function:
+
+.. code-block:: jinja
+
+ {% block title %}{% endblock %}
+
+
{{ block('title') }}
+
+ {% block body %}{% endblock %}
+
+.. seealso:: :doc:`extends<../tags/extends>`, :doc:`parent<../functions/parent>`
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/constant.rst b/plugins/twig/vendor/twig/twig/doc/functions/constant.rst
new file mode 100644
index 00000000..bea0e9fc
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/constant.rst
@@ -0,0 +1,18 @@
+``constant``
+============
+
+.. versionadded: 1.12.1
+ constant now accepts object instances as the second argument.
+
+``constant`` returns the constant value for a given string:
+
+.. code-block:: jinja
+
+ {{ some_date|date(constant('DATE_W3C')) }}
+ {{ constant('Namespace\\Classname::CONSTANT_NAME') }}
+
+As of 1.12.1 you can read constants from object instances as well:
+
+.. code-block:: jinja
+
+ {{ constant('RSS', date) }}
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/cycle.rst b/plugins/twig/vendor/twig/twig/doc/functions/cycle.rst
new file mode 100644
index 00000000..e3434932
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/cycle.rst
@@ -0,0 +1,28 @@
+``cycle``
+=========
+
+The ``cycle`` function cycles on an array of values:
+
+.. code-block:: jinja
+
+ {% set start_year = date() | date('Y') %}
+ {% set end_year = start_year + 5 %}
+
+ {% for year in start_year..end_year %}
+ {{ cycle(['odd', 'even'], loop.index0) }}
+ {% endfor %}
+
+The array can contain any number of values:
+
+.. code-block:: jinja
+
+ {% set fruits = ['apple', 'orange', 'citrus'] %}
+
+ {% for i in 0..10 %}
+ {{ cycle(fruits, i) }}
+ {% endfor %}
+
+Arguments
+---------
+
+* ``position``: The cycle position
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/date.rst b/plugins/twig/vendor/twig/twig/doc/functions/date.rst
new file mode 100644
index 00000000..714e08c4
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/date.rst
@@ -0,0 +1,52 @@
+``date``
+========
+
+.. versionadded:: 1.6
+ The date function has been added in Twig 1.6.
+
+.. versionadded:: 1.6.1
+ The default timezone support has been added in Twig 1.6.1.
+
+Converts an argument to a date to allow date comparison:
+
+.. code-block:: jinja
+
+ {% if date(user.created_at) < date('-2days') %}
+ {# do something #}
+ {% endif %}
+
+The argument must be in one of PHP’s supported `date and time formats`_.
+
+You can pass a timezone as the second argument:
+
+.. code-block:: jinja
+
+ {% if date(user.created_at) < date('-2days', 'Europe/Paris') %}
+ {# do something #}
+ {% endif %}
+
+If no argument is passed, the function returns the current date:
+
+.. code-block:: jinja
+
+ {% if date(user.created_at) < date() %}
+ {# always! #}
+ {% endif %}
+
+.. note::
+
+ You can set the default timezone globally by calling ``setTimezone()`` on
+ the ``core`` extension instance:
+
+ .. code-block:: php
+
+ $twig = new Twig_Environment($loader);
+ $twig->getExtension('core')->setTimezone('Europe/Paris');
+
+Arguments
+---------
+
+* ``date``: The date
+* ``timezone``: The timezone
+
+.. _`date and time formats`: http://php.net/manual/en/datetime.formats.php
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/dump.rst b/plugins/twig/vendor/twig/twig/doc/functions/dump.rst
new file mode 100644
index 00000000..a231f089
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/dump.rst
@@ -0,0 +1,69 @@
+``dump``
+========
+
+.. versionadded:: 1.5
+ The ``dump`` function was added in Twig 1.5.
+
+The ``dump`` function dumps information about a template variable. This is
+mostly useful to debug a template that does not behave as expected by
+introspecting its variables:
+
+.. code-block:: jinja
+
+ {{ dump(user) }}
+
+.. note::
+
+ The ``dump`` function is not available by default. You must add the
+ ``Twig_Extension_Debug`` extension explicitly when creating your Twig
+ environment::
+
+ $twig = new Twig_Environment($loader, array(
+ 'debug' => true,
+ // ...
+ ));
+ $twig->addExtension(new Twig_Extension_Debug());
+
+ Even when enabled, the ``dump`` function won't display anything if the
+ ``debug`` option on the environment is not enabled (to avoid leaking debug
+ information on a production server).
+
+In an HTML context, wrap the output with a ``pre`` tag to make it easier to
+read:
+
+.. code-block:: jinja
+
+
+ {{ dump(user) }}
+
+
+.. tip::
+
+ Using a ``pre`` tag is not needed when `XDebug`_ is enabled and
+ ``html_errors`` is ``on``; as a bonus, the output is also nicer with
+ XDebug enabled.
+
+You can debug several variables by passing them as additional arguments:
+
+.. code-block:: jinja
+
+ {{ dump(user, categories) }}
+
+If you don't pass any value, all variables from the current context are
+dumped:
+
+.. code-block:: jinja
+
+ {{ dump() }}
+
+.. note::
+
+ Internally, Twig uses the PHP `var_dump`_ function.
+
+Arguments
+---------
+
+* ``context``: The context to dump
+
+.. _`XDebug`: http://xdebug.org/docs/display
+.. _`var_dump`: http://php.net/var_dump
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/include.rst b/plugins/twig/vendor/twig/twig/doc/functions/include.rst
new file mode 100644
index 00000000..33bd56d1
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/include.rst
@@ -0,0 +1,80 @@
+``include``
+===========
+
+.. versionadded:: 1.12
+ The ``include`` function was added in Twig 1.12.
+
+The ``include`` function returns the rendered content of a template:
+
+.. code-block:: jinja
+
+ {{ include('template.html') }}
+ {{ include(some_var) }}
+
+Included templates have access to the variables of the active context.
+
+If you are using the filesystem loader, the templates are looked for in the
+paths defined by it.
+
+The context is passed by default to the template but you can also pass
+additional variables:
+
+.. code-block:: jinja
+
+ {# template.html will have access to the variables from the current context and the additional ones provided #}
+ {{ include('template.html', {foo: 'bar'}) }}
+
+You can disable access to the context by setting ``with_context`` to
+``false``:
+
+.. code-block:: jinja
+
+ {# only the foo variable will be accessible #}
+ {{ include('template.html', {foo: 'bar'}, with_context = false) }}
+
+.. code-block:: jinja
+
+ {# no variables will be accessible #}
+ {{ include('template.html', with_context = false) }}
+
+And if the expression evaluates to a ``Twig_Template`` object, Twig will use it
+directly::
+
+ // {{ include(template) }}
+
+ $template = $twig->loadTemplate('some_template.twig');
+
+ $twig->loadTemplate('template.twig')->display(array('template' => $template));
+
+When you set the ``ignore_missing`` flag, Twig will return an empty string if
+the template does not exist:
+
+.. code-block:: jinja
+
+ {{ include('sidebar.html', ignore_missing = true) }}
+
+You can also provide a list of templates that are checked for existence before
+inclusion. The first template that exists will be rendered:
+
+.. code-block:: jinja
+
+ {{ include(['page_detailed.html', 'page.html']) }}
+
+If ``ignore_missing`` is set, it will fall back to rendering nothing if none
+of the templates exist, otherwise it will throw an exception.
+
+When including a template created by an end user, you should consider
+sandboxing it:
+
+.. code-block:: jinja
+
+ {{ include('page.html', sandboxed = true) }}
+
+Arguments
+---------
+
+* ``template``: The template to render
+* ``variables``: The variables to pass to the template
+* ``with_context``: Whether to pass the current context variables or not
+* ``ignore_missing``: Whether to ignore missing templates or not
+* ``sandboxed``: Whether to sandbox the template or not
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/index.rst b/plugins/twig/vendor/twig/twig/doc/functions/index.rst
new file mode 100644
index 00000000..07214a76
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/index.rst
@@ -0,0 +1,20 @@
+Functions
+=========
+
+.. toctree::
+ :maxdepth: 1
+
+ attribute
+ block
+ constant
+ cycle
+ date
+ dump
+ include
+ max
+ min
+ parent
+ random
+ range
+ source
+ template_from_string
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/max.rst b/plugins/twig/vendor/twig/twig/doc/functions/max.rst
new file mode 100644
index 00000000..6f3cfc53
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/max.rst
@@ -0,0 +1,20 @@
+``max``
+=======
+
+.. versionadded:: 1.15
+ The ``max`` function was added in Twig 1.15.
+
+``max`` returns the biggest value of a sequence or a set of values:
+
+.. code-block:: jinja
+
+ {{ max(1, 3, 2) }}
+ {{ max([1, 3, 2]) }}
+
+When called with a mapping, max ignores keys and only compares values:
+
+.. code-block:: jinja
+
+ {{ max({2: "e", 1: "a", 3: "b", 5: "d", 4: "c"}) }}
+ {# returns "e" #}
+
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/min.rst b/plugins/twig/vendor/twig/twig/doc/functions/min.rst
new file mode 100644
index 00000000..7b6a65e1
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/min.rst
@@ -0,0 +1,20 @@
+``min``
+=======
+
+.. versionadded:: 1.15
+ The ``min`` function was added in Twig 1.15.
+
+``min`` returns the lowest value of a sequence or a set of values:
+
+.. code-block:: jinja
+
+ {{ min(1, 3, 2) }}
+ {{ min([1, 3, 2]) }}
+
+When called with a mapping, min ignores keys and only compares values:
+
+.. code-block:: jinja
+
+ {{ min({2: "e", 3: "a", 1: "b", 5: "d", 4: "c"}) }}
+ {# returns "a" #}
+
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/parent.rst b/plugins/twig/vendor/twig/twig/doc/functions/parent.rst
new file mode 100644
index 00000000..f5bd2001
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/parent.rst
@@ -0,0 +1,20 @@
+``parent``
+==========
+
+When a template uses inheritance, it's possible to render the contents of the
+parent block when overriding a block by using the ``parent`` function:
+
+.. code-block:: jinja
+
+ {% extends "base.html" %}
+
+ {% block sidebar %}
+
Table Of Contents
+ ...
+ {{ parent() }}
+ {% endblock %}
+
+The ``parent()`` call will return the content of the ``sidebar`` block as
+defined in the ``base.html`` template.
+
+.. seealso:: :doc:`extends<../tags/extends>`, :doc:`block<../functions/block>`, :doc:`block<../tags/block>`
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/random.rst b/plugins/twig/vendor/twig/twig/doc/functions/random.rst
new file mode 100644
index 00000000..168e74f8
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/random.rst
@@ -0,0 +1,29 @@
+``random``
+==========
+
+.. versionadded:: 1.5
+ The ``random`` function was added in Twig 1.5.
+
+.. versionadded:: 1.6
+ String and integer handling was added in Twig 1.6.
+
+The ``random`` function returns a random value depending on the supplied
+parameter type:
+
+* a random item from a sequence;
+* a random character from a string;
+* a random integer between 0 and the integer parameter (inclusive).
+
+.. code-block:: jinja
+
+ {{ random(['apple', 'orange', 'citrus']) }} {# example output: orange #}
+ {{ random('ABC') }} {# example output: C #}
+ {{ random() }} {# example output: 15386094 (works as the native PHP mt_rand function) #}
+ {{ random(5) }} {# example output: 3 #}
+
+Arguments
+---------
+
+* ``values``: The values
+
+.. _`mt_rand`: http://php.net/mt_rand
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/range.rst b/plugins/twig/vendor/twig/twig/doc/functions/range.rst
new file mode 100644
index 00000000..b7cd0111
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/range.rst
@@ -0,0 +1,45 @@
+``range``
+=========
+
+Returns a list containing an arithmetic progression of integers:
+
+.. code-block:: jinja
+
+ {% for i in range(0, 3) %}
+ {{ i }},
+ {% endfor %}
+
+ {# outputs 0, 1, 2, 3, #}
+
+When step is given (as the third parameter), it specifies the increment (or
+decrement):
+
+.. code-block:: jinja
+
+ {% for i in range(0, 6, 2) %}
+ {{ i }},
+ {% endfor %}
+
+ {# outputs 0, 2, 4, 6, #}
+
+The Twig built-in ``..`` operator is just syntactic sugar for the ``range``
+function (with a step of 1):
+
+.. code-block:: jinja
+
+ {% for i in 0..3 %}
+ {{ i }},
+ {% endfor %}
+
+.. tip::
+
+ The ``range`` function works as the native PHP `range`_ function.
+
+Arguments
+---------
+
+* ``low``: The first value of the sequence.
+* ``high``: The highest possible value of the sequence.
+* ``step``: The increment between elements of the sequence.
+
+.. _`range`: http://php.net/range
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/source.rst b/plugins/twig/vendor/twig/twig/doc/functions/source.rst
new file mode 100644
index 00000000..3c921b1c
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/source.rst
@@ -0,0 +1,32 @@
+``source``
+==========
+
+.. versionadded:: 1.15
+ The ``source`` function was added in Twig 1.15.
+
+.. versionadded:: 1.18.3
+ The ``ignore_missing`` flag was added in Twig 1.18.3.
+
+The ``source`` function returns the content of a template without rendering it:
+
+.. code-block:: jinja
+
+ {{ source('template.html') }}
+ {{ source(some_var) }}
+
+When you set the ``ignore_missing`` flag, Twig will return an empty string if
+the template does not exist:
+
+.. code-block:: jinja
+
+ {{ source('template.html', ignore_missing = true) }}
+
+The function uses the same template loaders as the ones used to include
+templates. So, if you are using the filesystem loader, the templates are looked
+for in the paths defined by it.
+
+Arguments
+---------
+
+* ``name``: The name of the template to read
+* ``ignore_missing``: Whether to ignore missing templates or not
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst b/plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst
new file mode 100644
index 00000000..ce6a60dc
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst
@@ -0,0 +1,32 @@
+``template_from_string``
+========================
+
+.. versionadded:: 1.11
+ The ``template_from_string`` function was added in Twig 1.11.
+
+The ``template_from_string`` function loads a template from a string:
+
+.. code-block:: jinja
+
+ {{ include(template_from_string("Hello {{ name }}")) }}
+ {{ include(template_from_string(page.template)) }}
+
+.. note::
+
+ The ``template_from_string`` function is not available by default. You
+ must add the ``Twig_Extension_StringLoader`` extension explicitly when
+ creating your Twig environment::
+
+ $twig = new Twig_Environment(...);
+ $twig->addExtension(new Twig_Extension_StringLoader());
+
+.. note::
+
+ Even if you will probably always use the ``template_from_string`` function
+ with the ``include`` function, you can use it with any tag or function that
+ takes a template as an argument (like the ``embed`` or ``extends`` tags).
+
+Arguments
+---------
+
+* ``template``: The template
diff --git a/plugins/twig/vendor/twig/twig/doc/index.rst b/plugins/twig/vendor/twig/twig/doc/index.rst
new file mode 100644
index 00000000..358bd738
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/index.rst
@@ -0,0 +1,19 @@
+Twig
+====
+
+.. toctree::
+ :maxdepth: 2
+
+ intro
+ installation
+ templates
+ api
+ advanced
+ internals
+ deprecated
+ recipes
+ coding_standards
+ tags/index
+ filters/index
+ functions/index
+ tests/index
diff --git a/plugins/twig/vendor/twig/twig/doc/installation.rst b/plugins/twig/vendor/twig/twig/doc/installation.rst
new file mode 100644
index 00000000..afdcf165
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/installation.rst
@@ -0,0 +1,116 @@
+Installation
+============
+
+You have multiple ways to install Twig.
+
+Installing the Twig PHP package
+-------------------------------
+
+Installing via Composer (recommended)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Install `Composer`_ and run the following command to get the latest version:
+
+.. code-block:: bash
+
+ composer require twig/twig:~1.0
+
+Installing from the tarball release
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Download the most recent tarball from the `download page`_
+2. Verify the integrity of the tarball http://fabien.potencier.org/article/73/signing-project-releases
+3. Unpack the tarball
+4. Move the files somewhere in your project
+
+Installing the development version
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: bash
+
+ git clone git://github.com/twigphp/Twig.git
+
+Installing the PEAR package
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+
+ Using PEAR for installing Twig is deprecated and Twig 1.15.1 was the last
+ version published on the PEAR channel; use Composer instead.
+
+.. code-block:: bash
+
+ pear channel-discover pear.twig-project.org
+ pear install twig/Twig
+
+Installing the C extension
+--------------------------
+
+.. versionadded:: 1.4
+ The C extension was added in Twig 1.4.
+
+.. note::
+
+ The C extension is **optional** but it brings some nice performance
+ improvements. Note that the extension is not a replacement for the PHP
+ code; it only implements a small part of the PHP code to improve the
+ performance at runtime; you must still install the regular PHP code.
+
+Twig comes with a C extension that enhances the performance of the Twig
+runtime engine; install it like any other PHP extensions:
+
+.. code-block:: bash
+
+ cd ext/twig
+ phpize
+ ./configure
+ make
+ make install
+
+.. note::
+
+ You can also install the C extension via PEAR (note that this method is
+ deprecated and newer versions of Twig are not available on the PEAR
+ channel):
+
+ .. code-block:: bash
+
+ pear channel-discover pear.twig-project.org
+ pear install twig/CTwig
+
+For Windows:
+
+1. Setup the build environment following the `PHP documentation`_
+2. Put Twig's C extension source code into ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\ext\twig``
+3. Use the ``configure --disable-all --enable-cli --enable-twig=shared`` command instead of step 14
+4. ``nmake``
+5. Copy the ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\Release_TS\php_twig.dll`` file to your PHP setup.
+
+.. tip::
+
+ For Windows ZendServer, ZTS is not enabled as mentioned in `Zend Server
+ FAQ`_.
+
+ You have to use ``configure --disable-all --disable-zts --enable-cli
+ --enable-twig=shared`` to be able to build the twig C extension for
+ ZendServer.
+
+ The built DLL will be available in
+ ``C:\\php-sdk\\phpdev\\vcXX\\x86\\php-source-directory\\Release``
+
+Finally, enable the extension in your ``php.ini`` configuration file:
+
+.. code-block:: ini
+
+ extension=twig.so #For Unix systems
+ extension=php_twig.dll #For Windows systems
+
+And from now on, Twig will automatically compile your templates to take
+advantage of the C extension. Note that this extension does not replace the
+PHP code but only provides an optimized version of the
+``Twig_Template::getAttribute()`` method.
+
+.. _`download page`: https://github.com/twigphp/Twig/tags
+.. _`Composer`: https://getcomposer.org/download/
+.. _`PHP documentation`: https://wiki.php.net/internals/windows/stepbystepbuild
+.. _`Zend Server FAQ`: http://www.zend.com/en/products/server/faq#faqD6
diff --git a/plugins/twig/vendor/twig/twig/doc/internals.rst b/plugins/twig/vendor/twig/twig/doc/internals.rst
new file mode 100644
index 00000000..ef1174dd
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/internals.rst
@@ -0,0 +1,138 @@
+Twig Internals
+==============
+
+Twig is very extensible and you can easily hack it. Keep in mind that you
+should probably try to create an extension before hacking the core, as most
+features and enhancements can be handled with extensions. This chapter is also
+useful for people who want to understand how Twig works under the hood.
+
+How does Twig work?
+-------------------
+
+The rendering of a Twig template can be summarized into four key steps:
+
+* **Load** the template: If the template is already compiled, load it and go
+ to the *evaluation* step, otherwise:
+
+ * First, the **lexer** tokenizes the template source code into small pieces
+ for easier processing;
+ * Then, the **parser** converts the token stream into a meaningful tree
+ of nodes (the Abstract Syntax Tree);
+ * Eventually, the *compiler* transforms the AST into PHP code.
+
+* **Evaluate** the template: It basically means calling the ``display()``
+ method of the compiled template and passing it the context.
+
+The Lexer
+---------
+
+The lexer tokenizes a template source code into a token stream (each token is
+an instance of ``Twig_Token``, and the stream is an instance of
+``Twig_TokenStream``). The default lexer recognizes 13 different token types:
+
+* ``Twig_Token::BLOCK_START_TYPE``, ``Twig_Token::BLOCK_END_TYPE``: Delimiters for blocks (``{% %}``)
+* ``Twig_Token::VAR_START_TYPE``, ``Twig_Token::VAR_END_TYPE``: Delimiters for variables (``{{ }}``)
+* ``Twig_Token::TEXT_TYPE``: A text outside an expression;
+* ``Twig_Token::NAME_TYPE``: A name in an expression;
+* ``Twig_Token::NUMBER_TYPE``: A number in an expression;
+* ``Twig_Token::STRING_TYPE``: A string in an expression;
+* ``Twig_Token::OPERATOR_TYPE``: An operator;
+* ``Twig_Token::PUNCTUATION_TYPE``: A punctuation sign;
+* ``Twig_Token::INTERPOLATION_START_TYPE``, ``Twig_Token::INTERPOLATION_END_TYPE`` (as of Twig 1.5): Delimiters for string interpolation;
+* ``Twig_Token::EOF_TYPE``: Ends of template.
+
+You can manually convert a source code into a token stream by calling the
+``tokenize()`` method of an environment::
+
+ $stream = $twig->tokenize($source, $identifier);
+
+As the stream has a ``__toString()`` method, you can have a textual
+representation of it by echoing the object::
+
+ echo $stream."\n";
+
+Here is the output for the ``Hello {{ name }}`` template:
+
+.. code-block:: text
+
+ TEXT_TYPE(Hello )
+ VAR_START_TYPE()
+ NAME_TYPE(name)
+ VAR_END_TYPE()
+ EOF_TYPE()
+
+.. note::
+
+ The default lexer (``Twig_Lexer``) can be changed by calling
+ the ``setLexer()`` method::
+
+ $twig->setLexer($lexer);
+
+The Parser
+----------
+
+The parser converts the token stream into an AST (Abstract Syntax Tree), or a
+node tree (an instance of ``Twig_Node_Module``). The core extension defines
+the basic nodes like: ``for``, ``if``, ... and the expression nodes.
+
+You can manually convert a token stream into a node tree by calling the
+``parse()`` method of an environment::
+
+ $nodes = $twig->parse($stream);
+
+Echoing the node object gives you a nice representation of the tree::
+
+ echo $nodes."\n";
+
+Here is the output for the ``Hello {{ name }}`` template:
+
+.. code-block:: text
+
+ Twig_Node_Module(
+ Twig_Node_Text(Hello )
+ Twig_Node_Print(
+ Twig_Node_Expression_Name(name)
+ )
+ )
+
+.. note::
+
+ The default parser (``Twig_TokenParser``) can be changed by calling the
+ ``setParser()`` method::
+
+ $twig->setParser($parser);
+
+The Compiler
+------------
+
+The last step is done by the compiler. It takes a node tree as an input and
+generates PHP code usable for runtime execution of the template.
+
+You can manually compile a node tree to PHP code with the ``compile()`` method
+of an environment::
+
+ $php = $twig->compile($nodes);
+
+The generated template for a ``Hello {{ name }}`` template reads as follows
+(the actual output can differ depending on the version of Twig you are
+using)::
+
+ /* Hello {{ name }} */
+ class __TwigTemplate_1121b6f109fe93ebe8c6e22e3712bceb extends Twig_Template
+ {
+ protected function doDisplay(array $context, array $blocks = array())
+ {
+ // line 1
+ echo "Hello ";
+ echo twig_escape_filter($this->env, isset($context["name"]) ? $context["name"] : null), "html", null, true);
+ }
+
+ // some more code
+ }
+
+.. note::
+
+ The default compiler (``Twig_Compiler``) can be changed by calling the
+ ``setCompiler()`` method::
+
+ $twig->setCompiler($compiler);
diff --git a/plugins/twig/vendor/twig/twig/doc/intro.rst b/plugins/twig/vendor/twig/twig/doc/intro.rst
new file mode 100644
index 00000000..9b38c97d
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/intro.rst
@@ -0,0 +1,85 @@
+Introduction
+============
+
+This is the documentation for Twig, the flexible, fast, and secure template
+engine for PHP.
+
+If you have any exposure to other text-based template languages, such as
+Smarty, Django, or Jinja, you should feel right at home with Twig. It's both
+designer and developer friendly by sticking to PHP's principles and adding
+functionality useful for templating environments.
+
+The key-features are...
+
+* *Fast*: Twig compiles templates down to plain optimized PHP code. The
+ overhead compared to regular PHP code was reduced to the very minimum.
+
+* *Secure*: Twig has a sandbox mode to evaluate untrusted template code. This
+ allows Twig to be used as a template language for applications where users
+ may modify the template design.
+
+* *Flexible*: Twig is powered by a flexible lexer and parser. This allows the
+ developer to define its own custom tags and filters, and create its own DSL.
+
+Twig is used by many Open-Source projects like Symfony, Drupal8, eZPublish,
+phpBB, Piwik, OroCRM, and many frameworks have support for it as well like
+Slim, Yii, Laravel, Codeigniter, and Kohana, just to name a few.
+
+Prerequisites
+-------------
+
+Twig needs at least **PHP 5.2.7** to run.
+
+Installation
+------------
+
+The recommended way to install Twig is via Composer:
+
+.. code-block:: bash
+
+ composer require "twig/twig:~1.0"
+
+.. note::
+
+ To learn more about the other installation methods, read the
+ :doc:`installation` chapter; it also explains how to install
+ the Twig C extension.
+
+Basic API Usage
+---------------
+
+This section gives you a brief introduction to the PHP API for Twig.
+
+.. code-block:: php
+
+ require_once '/path/to/vendor/autoload.php';
+
+ $loader = new Twig_Loader_Array(array(
+ 'index' => 'Hello {{ name }}!',
+ ));
+ $twig = new Twig_Environment($loader);
+
+ echo $twig->render('index', array('name' => 'Fabien'));
+
+Twig uses a loader (``Twig_Loader_Array``) to locate templates, and an
+environment (``Twig_Environment``) to store the configuration.
+
+The ``render()`` method loads the template passed as a first argument and
+renders it with the variables passed as a second argument.
+
+As templates are generally stored on the filesystem, Twig also comes with a
+filesystem loader::
+
+ $loader = new Twig_Loader_Filesystem('/path/to/templates');
+ $twig = new Twig_Environment($loader, array(
+ 'cache' => '/path/to/compilation_cache',
+ ));
+
+ echo $twig->render('index.html', array('name' => 'Fabien'));
+
+.. tip::
+
+ If you are not using Composer, use the Twig built-in autoloader::
+
+ require_once '/path/to/lib/Twig/Autoloader.php';
+ Twig_Autoloader::register();
diff --git a/plugins/twig/vendor/twig/twig/doc/recipes.rst b/plugins/twig/vendor/twig/twig/doc/recipes.rst
new file mode 100644
index 00000000..6ad53276
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/recipes.rst
@@ -0,0 +1,518 @@
+Recipes
+=======
+
+.. _deprecation-notices:
+
+Displaying Deprecation Notices
+------------------------------
+
+.. versionadded:: 1.21
+ This works as of Twig 1.21.
+
+Deprecated features generate deprecation notices (via a call to the
+``trigger_error()`` PHP function). By default, they are silenced and never
+displayed nor logged.
+
+To easily remove all deprecated feature usages from your templates, write and
+run a script along the lines of the following::
+
+ require_once __DIR__.'/vendor/autoload.php';
+
+ $twig = create_your_twig_env();
+
+ $deprecations = new Twig_Util_DeprecationCollector($twig);
+
+ print_r($deprecations->collectDir(__DIR__.'/templates'));
+
+The ``collectDir()`` method compiles all templates found in a directory,
+catches deprecation notices, and return them.
+
+.. tip::
+
+ If your templates are not stored on the filesystem, use the ``collect()``
+ method instead which takes an ``Iterator``; the iterator must return
+ template names as keys and template contents as values (as done by
+ ``Twig_Util_TemplateDirIterator``).
+
+However, this code won't find all deprecations (like using deprecated some Twig
+classes). To catch all notices, register a custom error handler like the one
+below::
+
+ $deprecations = array();
+ set_error_handler(function ($type, $msg) use (&$deprecations) {
+ if (E_USER_DEPRECATED === $type) {
+ $deprecations[] = $msg;
+ }
+ });
+
+ // run your application
+
+ print_r($deprecations);
+
+Note that most deprecation notices are triggered during **compilation**, so
+they won't be generated when templates are already cached.
+
+.. tip::
+
+ If you want to manage the deprecation notices from your PHPUnit tests, have
+ a look at the `symfony/phpunit-bridge
+ `_ package, which eases the
+ process a lot.
+
+Making a Layout conditional
+---------------------------
+
+Working with Ajax means that the same content is sometimes displayed as is,
+and sometimes decorated with a layout. As Twig layout template names can be
+any valid expression, you can pass a variable that evaluates to ``true`` when
+the request is made via Ajax and choose the layout accordingly:
+
+.. code-block:: jinja
+
+ {% extends request.ajax ? "base_ajax.html" : "base.html" %}
+
+ {% block content %}
+ This is the content to be displayed.
+ {% endblock %}
+
+Making an Include dynamic
+-------------------------
+
+When including a template, its name does not need to be a string. For
+instance, the name can depend on the value of a variable:
+
+.. code-block:: jinja
+
+ {% include var ~ '_foo.html' %}
+
+If ``var`` evaluates to ``index``, the ``index_foo.html`` template will be
+rendered.
+
+As a matter of fact, the template name can be any valid expression, such as
+the following:
+
+.. code-block:: jinja
+
+ {% include var|default('index') ~ '_foo.html' %}
+
+Overriding a Template that also extends itself
+----------------------------------------------
+
+A template can be customized in two different ways:
+
+* *Inheritance*: A template *extends* a parent template and overrides some
+ blocks;
+
+* *Replacement*: If you use the filesystem loader, Twig loads the first
+ template it finds in a list of configured directories; a template found in a
+ directory *replaces* another one from a directory further in the list.
+
+But how do you combine both: *replace* a template that also extends itself
+(aka a template in a directory further in the list)?
+
+Let's say that your templates are loaded from both ``.../templates/mysite``
+and ``.../templates/default`` in this order. The ``page.twig`` template,
+stored in ``.../templates/default`` reads as follows:
+
+.. code-block:: jinja
+
+ {# page.twig #}
+ {% extends "layout.twig" %}
+
+ {% block content %}
+ {% endblock %}
+
+You can replace this template by putting a file with the same name in
+``.../templates/mysite``. And if you want to extend the original template, you
+might be tempted to write the following:
+
+.. code-block:: jinja
+
+ {# page.twig in .../templates/mysite #}
+ {% extends "page.twig" %} {# from .../templates/default #}
+
+Of course, this will not work as Twig will always load the template from
+``.../templates/mysite``.
+
+It turns out it is possible to get this to work, by adding a directory right
+at the end of your template directories, which is the parent of all of the
+other directories: ``.../templates`` in our case. This has the effect of
+making every template file within our system uniquely addressable. Most of the
+time you will use the "normal" paths, but in the special case of wanting to
+extend a template with an overriding version of itself we can reference its
+parent's full, unambiguous template path in the extends tag:
+
+.. code-block:: jinja
+
+ {# page.twig in .../templates/mysite #}
+ {% extends "default/page.twig" %} {# from .../templates #}
+
+.. note::
+
+ This recipe was inspired by the following Django wiki page:
+ http://code.djangoproject.com/wiki/ExtendingTemplates
+
+Customizing the Syntax
+----------------------
+
+Twig allows some syntax customization for the block delimiters. It's not
+recommended to use this feature as templates will be tied with your custom
+syntax. But for specific projects, it can make sense to change the defaults.
+
+To change the block delimiters, you need to create your own lexer object::
+
+ $twig = new Twig_Environment();
+
+ $lexer = new Twig_Lexer($twig, array(
+ 'tag_comment' => array('{#', '#}'),
+ 'tag_block' => array('{%', '%}'),
+ 'tag_variable' => array('{{', '}}'),
+ 'interpolation' => array('#{', '}'),
+ ));
+ $twig->setLexer($lexer);
+
+Here are some configuration example that simulates some other template engines
+syntax::
+
+ // Ruby erb syntax
+ $lexer = new Twig_Lexer($twig, array(
+ 'tag_comment' => array('<%#', '%>'),
+ 'tag_block' => array('<%', '%>'),
+ 'tag_variable' => array('<%=', '%>'),
+ ));
+
+ // SGML Comment Syntax
+ $lexer = new Twig_Lexer($twig, array(
+ 'tag_comment' => array(''),
+ 'tag_block' => array(''),
+ 'tag_variable' => array('${', '}'),
+ ));
+
+ // Smarty like
+ $lexer = new Twig_Lexer($twig, array(
+ 'tag_comment' => array('{*', '*}'),
+ 'tag_block' => array('{', '}'),
+ 'tag_variable' => array('{$', '}'),
+ ));
+
+Using dynamic Object Properties
+-------------------------------
+
+When Twig encounters a variable like ``article.title``, it tries to find a
+``title`` public property in the ``article`` object.
+
+It also works if the property does not exist but is rather defined dynamically
+thanks to the magic ``__get()`` method; you just need to also implement the
+``__isset()`` magic method like shown in the following snippet of code::
+
+ class Article
+ {
+ public function __get($name)
+ {
+ if ('title' == $name) {
+ return 'The title';
+ }
+
+ // throw some kind of error
+ }
+
+ public function __isset($name)
+ {
+ if ('title' == $name) {
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+Accessing the parent Context in Nested Loops
+--------------------------------------------
+
+Sometimes, when using nested loops, you need to access the parent context. The
+parent context is always accessible via the ``loop.parent`` variable. For
+instance, if you have the following template data::
+
+ $data = array(
+ 'topics' => array(
+ 'topic1' => array('Message 1 of topic 1', 'Message 2 of topic 1'),
+ 'topic2' => array('Message 1 of topic 2', 'Message 2 of topic 2'),
+ ),
+ );
+
+And the following template to display all messages in all topics:
+
+.. code-block:: jinja
+
+ {% for topic, messages in topics %}
+ * {{ loop.index }}: {{ topic }}
+ {% for message in messages %}
+ - {{ loop.parent.loop.index }}.{{ loop.index }}: {{ message }}
+ {% endfor %}
+ {% endfor %}
+
+The output will be similar to:
+
+.. code-block:: text
+
+ * 1: topic1
+ - 1.1: The message 1 of topic 1
+ - 1.2: The message 2 of topic 1
+ * 2: topic2
+ - 2.1: The message 1 of topic 2
+ - 2.2: The message 2 of topic 2
+
+In the inner loop, the ``loop.parent`` variable is used to access the outer
+context. So, the index of the current ``topic`` defined in the outer for loop
+is accessible via the ``loop.parent.loop.index`` variable.
+
+Defining undefined Functions and Filters on the Fly
+---------------------------------------------------
+
+When a function (or a filter) is not defined, Twig defaults to throw a
+``Twig_Error_Syntax`` exception. However, it can also call a `callback`_ (any
+valid PHP callable) which should return a function (or a filter).
+
+For filters, register callbacks with ``registerUndefinedFilterCallback()``.
+For functions, use ``registerUndefinedFunctionCallback()``::
+
+ // auto-register all native PHP functions as Twig functions
+ // don't try this at home as it's not secure at all!
+ $twig->registerUndefinedFunctionCallback(function ($name) {
+ if (function_exists($name)) {
+ return new Twig_Function_Function($name);
+ }
+
+ return false;
+ });
+
+If the callable is not able to return a valid function (or filter), it must
+return ``false``.
+
+If you register more than one callback, Twig will call them in turn until one
+does not return ``false``.
+
+.. tip::
+
+ As the resolution of functions and filters is done during compilation,
+ there is no overhead when registering these callbacks.
+
+Validating the Template Syntax
+------------------------------
+
+When template code is provided by a third-party (through a web interface for
+instance), it might be interesting to validate the template syntax before
+saving it. If the template code is stored in a `$template` variable, here is
+how you can do it::
+
+ try {
+ $twig->parse($twig->tokenize($template));
+
+ // the $template is valid
+ } catch (Twig_Error_Syntax $e) {
+ // $template contains one or more syntax errors
+ }
+
+If you iterate over a set of files, you can pass the filename to the
+``tokenize()`` method to get the filename in the exception message::
+
+ foreach ($files as $file) {
+ try {
+ $twig->parse($twig->tokenize($template, $file));
+
+ // the $template is valid
+ } catch (Twig_Error_Syntax $e) {
+ // $template contains one or more syntax errors
+ }
+ }
+
+.. note::
+
+ This method won't catch any sandbox policy violations because the policy
+ is enforced during template rendering (as Twig needs the context for some
+ checks like allowed methods on objects).
+
+Refreshing modified Templates when OPcache or APC is enabled
+------------------------------------------------------------
+
+When using OPcache with ``opcache.validate_timestamps`` set to ``0`` or APC
+with ``apc.stat`` set to ``0`` and Twig cache enabled, clearing the template
+cache won't update the cache.
+
+To get around this, force Twig to invalidate the bytecode cache::
+
+ $twig = new Twig_Environment($loader, array(
+ 'cache' => new Twig_Cache_Filesystem('/some/cache/path', Twig_Cache_Filesystem::FORCE_BYTECODE_INVALIDATION),
+ // ...
+ ));
+
+.. note::
+
+ Before Twig 1.22, you should extend ``Twig_Environment`` instead::
+
+ class OpCacheAwareTwigEnvironment extends Twig_Environment
+ {
+ protected function writeCacheFile($file, $content)
+ {
+ parent::writeCacheFile($file, $content);
+
+ // Compile cached file into bytecode cache
+ if (function_exists('opcache_invalidate')) {
+ opcache_invalidate($file, true);
+ } elseif (function_exists('apc_compile_file')) {
+ apc_compile_file($file);
+ }
+ }
+ }
+
+Reusing a stateful Node Visitor
+-------------------------------
+
+When attaching a visitor to a ``Twig_Environment`` instance, Twig uses it to
+visit *all* templates it compiles. If you need to keep some state information
+around, you probably want to reset it when visiting a new template.
+
+This can be easily achieved with the following code::
+
+ protected $someTemplateState = array();
+
+ public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
+ {
+ if ($node instanceof Twig_Node_Module) {
+ // reset the state as we are entering a new template
+ $this->someTemplateState = array();
+ }
+
+ // ...
+
+ return $node;
+ }
+
+Using a Database to store Templates
+-----------------------------------
+
+If you are developing a CMS, templates are usually stored in a database. This
+recipe gives you a simple PDO template loader you can use as a starting point
+for your own.
+
+First, let's create a temporary in-memory SQLite3 database to work with::
+
+ $dbh = new PDO('sqlite::memory:');
+ $dbh->exec('CREATE TABLE templates (name STRING, source STRING, last_modified INTEGER)');
+ $base = '{% block content %}{% endblock %}';
+ $index = '
+ {% extends "base.twig" %}
+ {% block content %}Hello {{ name }}{% endblock %}
+ ';
+ $now = time();
+ $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('base.twig', '$base', $now)");
+ $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('index.twig', '$index', $now)");
+
+We have created a simple ``templates`` table that hosts two templates:
+``base.twig`` and ``index.twig``.
+
+Now, let's define a loader able to use this database::
+
+ class DatabaseTwigLoader implements Twig_LoaderInterface, Twig_ExistsLoaderInterface
+ {
+ protected $dbh;
+
+ public function __construct(PDO $dbh)
+ {
+ $this->dbh = $dbh;
+ }
+
+ public function getSource($name)
+ {
+ if (false === $source = $this->getValue('source', $name)) {
+ throw new Twig_Error_Loader(sprintf('Template "%s" does not exist.', $name));
+ }
+
+ return $source;
+ }
+
+ // Twig_ExistsLoaderInterface as of Twig 1.11
+ public function exists($name)
+ {
+ return $name === $this->getValue('name', $name);
+ }
+
+ public function getCacheKey($name)
+ {
+ return $name;
+ }
+
+ public function isFresh($name, $time)
+ {
+ if (false === $lastModified = $this->getValue('last_modified', $name)) {
+ return false;
+ }
+
+ return $lastModified <= $time;
+ }
+
+ protected function getValue($column, $name)
+ {
+ $sth = $this->dbh->prepare('SELECT '.$column.' FROM templates WHERE name = :name');
+ $sth->execute(array(':name' => (string) $name));
+
+ return $sth->fetchColumn();
+ }
+ }
+
+Finally, here is an example on how you can use it::
+
+ $loader = new DatabaseTwigLoader($dbh);
+ $twig = new Twig_Environment($loader);
+
+ echo $twig->render('index.twig', array('name' => 'Fabien'));
+
+Using different Template Sources
+--------------------------------
+
+This recipe is the continuation of the previous one. Even if you store the
+contributed templates in a database, you might want to keep the original/base
+templates on the filesystem. When templates can be loaded from different
+sources, you need to use the ``Twig_Loader_Chain`` loader.
+
+As you can see in the previous recipe, we reference the template in the exact
+same way as we would have done it with a regular filesystem loader. This is
+the key to be able to mix and match templates coming from the database, the
+filesystem, or any other loader for that matter: the template name should be a
+logical name, and not the path from the filesystem::
+
+ $loader1 = new DatabaseTwigLoader($dbh);
+ $loader2 = new Twig_Loader_Array(array(
+ 'base.twig' => '{% block content %}{% endblock %}',
+ ));
+ $loader = new Twig_Loader_Chain(array($loader1, $loader2));
+
+ $twig = new Twig_Environment($loader);
+
+ echo $twig->render('index.twig', array('name' => 'Fabien'));
+
+Now that the ``base.twig`` templates is defined in an array loader, you can
+remove it from the database, and everything else will still work as before.
+
+Loading a Template from a String
+--------------------------------
+
+From a template, you can easily load a template stored in a string via the
+``template_from_string`` function (available as of Twig 1.11 via the
+``Twig_Extension_StringLoader`` extension)::
+
+.. code-block:: jinja
+
+ {{ include(template_from_string("Hello {{ name }}")) }}
+
+From PHP, it's also possible to load a template stored in a string via
+``Twig_Environment::createTemplate()`` (available as of Twig 1.18)::
+
+ $template = $twig->createTemplate('hello {{ name }}');
+ echo $template->render(array('name' => 'Fabien'));
+
+.. note::
+
+ Never use the ``Twig_Loader_String`` loader, which has severe limitations.
+
+.. _callback: http://www.php.net/manual/en/function.is-callable.php
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst b/plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst
new file mode 100644
index 00000000..4208d1a3
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst
@@ -0,0 +1,83 @@
+``autoescape``
+==============
+
+Whether automatic escaping is enabled or not, you can mark a section of a
+template to be escaped or not by using the ``autoescape`` tag:
+
+.. code-block:: jinja
+
+ {# The following syntax works as of Twig 1.8 -- see the note below for previous versions #}
+
+ {% autoescape %}
+ Everything will be automatically escaped in this block
+ using the HTML strategy
+ {% endautoescape %}
+
+ {% autoescape 'html' %}
+ Everything will be automatically escaped in this block
+ using the HTML strategy
+ {% endautoescape %}
+
+ {% autoescape 'js' %}
+ Everything will be automatically escaped in this block
+ using the js escaping strategy
+ {% endautoescape %}
+
+ {% autoescape false %}
+ Everything will be outputted as is in this block
+ {% endautoescape %}
+
+.. note::
+
+ Before Twig 1.8, the syntax was different:
+
+ .. code-block:: jinja
+
+ {% autoescape true %}
+ Everything will be automatically escaped in this block
+ using the HTML strategy
+ {% endautoescape %}
+
+ {% autoescape false %}
+ Everything will be outputted as is in this block
+ {% endautoescape %}
+
+ {% autoescape true js %}
+ Everything will be automatically escaped in this block
+ using the js escaping strategy
+ {% endautoescape %}
+
+When automatic escaping is enabled everything is escaped by default except for
+values explicitly marked as safe. Those can be marked in the template by using
+the :doc:`raw<../filters/raw>` filter:
+
+.. code-block:: jinja
+
+ {% autoescape %}
+ {{ safe_value|raw }}
+ {% endautoescape %}
+
+Functions returning template data (like :doc:`macros` and
+:doc:`parent<../functions/parent>`) always return safe markup.
+
+.. note::
+
+ Twig is smart enough to not escape an already escaped value by the
+ :doc:`escape<../filters/escape>` filter.
+
+.. note::
+
+ Twig does not escape static expressions:
+
+ .. code-block:: jinja
+
+ {% set hello = "Hello" %}
+ {{ hello }}
+ {{ "world" }}
+
+ Will be rendered "Hello **world**".
+
+.. note::
+
+ The chapter :doc:`Twig for Developers<../api>` gives more information
+ about when and how automatic escaping is applied.
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/block.rst b/plugins/twig/vendor/twig/twig/doc/tags/block.rst
new file mode 100644
index 00000000..e3804823
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/tags/block.rst
@@ -0,0 +1,11 @@
+``block``
+=========
+
+Blocks are used for inheritance and act as placeholders and replacements at
+the same time. They are documented in detail in the documentation for the
+:doc:`extends<../tags/extends>` tag.
+
+Block names should consist of alphanumeric characters, and underscores. Dashes
+are not permitted.
+
+.. seealso:: :doc:`block<../functions/block>`, :doc:`parent<../functions/parent>`, :doc:`use<../tags/use>`, :doc:`extends<../tags/extends>`
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/do.rst b/plugins/twig/vendor/twig/twig/doc/tags/do.rst
new file mode 100644
index 00000000..1c344e30
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/tags/do.rst
@@ -0,0 +1,12 @@
+``do``
+======
+
+.. versionadded:: 1.5
+ The ``do`` tag was added in Twig 1.5.
+
+The ``do`` tag works exactly like the regular variable expression (``{{ ...
+}}``) just that it doesn't print anything:
+
+.. code-block:: jinja
+
+ {% do 1 + 2 %}
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/embed.rst b/plugins/twig/vendor/twig/twig/doc/tags/embed.rst
new file mode 100644
index 00000000..5a6a0299
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/tags/embed.rst
@@ -0,0 +1,178 @@
+``embed``
+=========
+
+.. versionadded:: 1.8
+ The ``embed`` tag was added in Twig 1.8.
+
+The ``embed`` tag combines the behaviour of :doc:`include` and
+:doc:`extends`.
+It allows you to include another template's contents, just like ``include``
+does. But it also allows you to override any block defined inside the
+included template, like when extending a template.
+
+Think of an embedded template as a "micro layout skeleton".
+
+.. code-block:: jinja
+
+ {% embed "teasers_skeleton.twig" %}
+ {# These blocks are defined in "teasers_skeleton.twig" #}
+ {# and we override them right here: #}
+ {% block left_teaser %}
+ Some content for the left teaser box
+ {% endblock %}
+ {% block right_teaser %}
+ Some content for the right teaser box
+ {% endblock %}
+ {% endembed %}
+
+The ``embed`` tag takes the idea of template inheritance to the level of
+content fragments. While template inheritance allows for "document skeletons",
+which are filled with life by child templates, the ``embed`` tag allows you to
+create "skeletons" for smaller units of content and re-use and fill them
+anywhere you like.
+
+Since the use case may not be obvious, let's look at a simplified example.
+Imagine a base template shared by multiple HTML pages, defining a single block
+named "content":
+
+.. code-block:: text
+
+ ┌─── page layout ─────────────────────┐
+ │ │
+ │ ┌── block "content" ──┐ │
+ │ │ │ │
+ │ │ │ │
+ │ │ (child template to │ │
+ │ │ put content here) │ │
+ │ │ │ │
+ │ │ │ │
+ │ └─────────────────────┘ │
+ │ │
+ └─────────────────────────────────────┘
+
+Some pages ("foo" and "bar") share the same content structure -
+two vertically stacked boxes:
+
+.. code-block:: text
+
+ ┌─── page layout ─────────────────────┐
+ │ │
+ │ ┌── block "content" ──┐ │
+ │ │ ┌─ block "top" ───┐ │ │
+ │ │ │ │ │ │
+ │ │ └─────────────────┘ │ │
+ │ │ ┌─ block "bottom" ┐ │ │
+ │ │ │ │ │ │
+ │ │ └─────────────────┘ │ │
+ │ └─────────────────────┘ │
+ │ │
+ └─────────────────────────────────────┘
+
+While other pages ("boom" and "baz") share a different content structure -
+two boxes side by side:
+
+.. code-block:: text
+
+ ┌─── page layout ─────────────────────┐
+ │ │
+ │ ┌── block "content" ──┐ │
+ │ │ │ │
+ │ │ ┌ block ┐ ┌ block ┐ │ │
+ │ │ │"left" │ │"right"│ │ │
+ │ │ │ │ │ │ │ │
+ │ │ │ │ │ │ │ │
+ │ │ └───────┘ └───────┘ │ │
+ │ └─────────────────────┘ │
+ │ │
+ └─────────────────────────────────────┘
+
+Without the ``embed`` tag, you have two ways to design your templates:
+
+ * Create two "intermediate" base templates that extend the master layout
+ template: one with vertically stacked boxes to be used by the "foo" and
+ "bar" pages and another one with side-by-side boxes for the "boom" and
+ "baz" pages.
+
+ * Embed the markup for the top/bottom and left/right boxes into each page
+ template directly.
+
+These two solutions do not scale well because they each have a major drawback:
+
+ * The first solution may indeed work for this simplified example. But imagine
+ we add a sidebar, which may again contain different, recurring structures
+ of content. Now we would need to create intermediate base templates for
+ all occurring combinations of content structure and sidebar structure...
+ and so on.
+
+ * The second solution involves duplication of common code with all its negative
+ consequences: any change involves finding and editing all affected copies
+ of the structure, correctness has to be verified for each copy, copies may
+ go out of sync by careless modifications etc.
+
+In such a situation, the ``embed`` tag comes in handy. The common layout
+code can live in a single base template, and the two different content structures,
+let's call them "micro layouts" go into separate templates which are embedded
+as necessary:
+
+Page template ``foo.twig``:
+
+.. code-block:: jinja
+
+ {% extends "layout_skeleton.twig" %}
+
+ {% block content %}
+ {% embed "vertical_boxes_skeleton.twig" %}
+ {% block top %}
+ Some content for the top box
+ {% endblock %}
+
+ {% block bottom %}
+ Some content for the bottom box
+ {% endblock %}
+ {% endembed %}
+ {% endblock %}
+
+And here is the code for ``vertical_boxes_skeleton.twig``:
+
+.. code-block:: html+jinja
+
+
+ {% block top %}
+ Top box default content
+ {% endblock %}
+
+
+The goal of the ``vertical_boxes_skeleton.twig`` template being to factor
+out the HTML markup for the boxes.
+
+The ``embed`` tag takes the exact same arguments as the ``include`` tag:
+
+.. code-block:: jinja
+
+ {% embed "base" with {'foo': 'bar'} %}
+ ...
+ {% endembed %}
+
+ {% embed "base" with {'foo': 'bar'} only %}
+ ...
+ {% endembed %}
+
+ {% embed "base" ignore missing %}
+ ...
+ {% endembed %}
+
+.. warning::
+
+ As embedded templates do not have "names", auto-escaping strategies based
+ on the template "filename" won't work as expected if you change the
+ context (for instance, if you embed a CSS/JavaScript template into an HTML
+ one). In that case, explicitly set the default auto-escaping strategy with
+ the ``autoescape`` tag.
+
+.. seealso:: :doc:`include<../tags/include>`
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/extends.rst b/plugins/twig/vendor/twig/twig/doc/tags/extends.rst
new file mode 100644
index 00000000..1ad2b12b
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/doc/tags/extends.rst
@@ -0,0 +1,268 @@
+``extends``
+===========
+
+The ``extends`` tag can be used to extend a template from another one.
+
+.. note::
+
+ Like PHP, Twig does not support multiple inheritance. So you can only have
+ one extends tag called per rendering. However, Twig supports horizontal
+ :doc:`reuse
";
+echo trim(preg_replace('/>\s+', '><', ob_get_clean()));
+EOF
+ ),
+ );
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
new file mode 100644
index 00000000..ceaf67f4
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
@@ -0,0 +1,28 @@
+assertEquals('foo', $node->getAttribute('data'));
+ }
+
+ public function getTests()
+ {
+ $tests = array();
+ $tests[] = array(new Twig_Node_Text('foo', 1), "// line 1\necho \"foo\";");
+
+ return $tests;
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
new file mode 100644
index 00000000..b5ea7aac
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
@@ -0,0 +1,124 @@
+getMock('Twig_LoaderInterface'), array('cache' => false, 'autoescape' => false));
+
+ $stream = $env->parse($env->tokenize('{{ block("foo") }}', 'index'));
+
+ $node = $stream->getNode('body')->getNode(0);
+
+ $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node));
+ $this->assertTrue($node->getAttribute('output'));
+ }
+
+ public function testRenderParentBlockOptimizer()
+ {
+ $env = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('cache' => false, 'autoescape' => false));
+
+ $stream = $env->parse($env->tokenize('{% extends "foo" %}{% block content %}{{ parent() }}{% endblock %}', 'index'));
+
+ $node = $stream->getNode('blocks')->getNode('content')->getNode(0)->getNode('body');
+
+ $this->assertEquals('Twig_Node_Expression_Parent', get_class($node));
+ $this->assertTrue($node->getAttribute('output'));
+ }
+
+ public function testRenderVariableBlockOptimizer()
+ {
+ if (PHP_VERSION_ID >= 50400) {
+ return;
+ }
+
+ $env = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('cache' => false, 'autoescape' => false));
+ $stream = $env->parse($env->tokenize('{{ block(name|lower) }}', 'index'));
+
+ $node = $stream->getNode('body')->getNode(0)->getNode(1);
+
+ $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node));
+ $this->assertTrue($node->getAttribute('output'));
+ }
+
+ /**
+ * @dataProvider getTestsForForOptimizer
+ */
+ public function testForOptimizer($template, $expected)
+ {
+ $env = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('cache' => false));
+
+ $stream = $env->parse($env->tokenize($template, 'index'));
+
+ foreach ($expected as $target => $withLoop) {
+ $this->assertTrue($this->checkForConfiguration($stream, $target, $withLoop), sprintf('variable %s is %soptimized', $target, $withLoop ? 'not ' : ''));
+ }
+ }
+
+ public function getTestsForForOptimizer()
+ {
+ return array(
+ array('{% for i in foo %}{% endfor %}', array('i' => false)),
+
+ array('{% for i in foo %}{{ loop.index }}{% endfor %}', array('i' => true)),
+
+ array('{% for i in foo %}{% for j in foo %}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)),
+
+ array('{% for i in foo %}{% include "foo" %}{% endfor %}', array('i' => true)),
+
+ array('{% for i in foo %}{% include "foo" only %}{% endfor %}', array('i' => false)),
+
+ array('{% for i in foo %}{% include "foo" with { "foo": "bar" } only %}{% endfor %}', array('i' => false)),
+
+ array('{% for i in foo %}{% include "foo" with { "foo": loop.index } only %}{% endfor %}', array('i' => true)),
+
+ array('{% for i in foo %}{% for j in foo %}{{ loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => true)),
+
+ array('{% for i in foo %}{% for j in foo %}{{ loop.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)),
+
+ array('{% for i in foo %}{% set l = loop %}{% for j in foo %}{{ l.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => false)),
+
+ array('{% for i in foo %}{% for j in foo %}{{ foo.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)),
+
+ array('{% for i in foo %}{% for j in foo %}{{ loop["parent"].loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)),
+
+ array('{% for i in foo %}{{ include("foo") }}{% endfor %}', array('i' => true)),
+
+ array('{% for i in foo %}{{ include("foo", with_context = false) }}{% endfor %}', array('i' => false)),
+
+ array('{% for i in foo %}{{ include("foo", with_context = true) }}{% endfor %}', array('i' => true)),
+
+ array('{% for i in foo %}{{ include("foo", { "foo": "bar" }, with_context = false) }}{% endfor %}', array('i' => false)),
+
+ array('{% for i in foo %}{{ include("foo", { "foo": loop.index }, with_context = false) }}{% endfor %}', array('i' => true)),
+ );
+ }
+
+ public function checkForConfiguration(Twig_NodeInterface $node = null, $target, $withLoop)
+ {
+ if (null === $node) {
+ return;
+ }
+
+ foreach ($node as $n) {
+ if ($n instanceof Twig_Node_For) {
+ if ($target === $n->getNode('value_target')->getAttribute('name')) {
+ return $withLoop == $n->getAttribute('with_loop');
+ }
+ }
+
+ $ret = $this->checkForConfiguration($n, $target, $withLoop);
+ if (null !== $ret) {
+ return $ret;
+ }
+ }
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/ParserTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/ParserTest.php
new file mode 100644
index 00000000..01daf309
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/ParserTest.php
@@ -0,0 +1,196 @@
+getParser();
+ $parser->setMacro('parent', $this->getMock('Twig_Node_Macro', array(), array(), '', null));
+ }
+
+ /**
+ * @expectedException Twig_Error_Syntax
+ * @expectedExceptionMessage Unknown "foo" tag. Did you mean "for" at line 1?
+ */
+ public function testUnknownTag()
+ {
+ $stream = new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1),
+ new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
+ new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
+ ));
+ $parser = new Twig_Parser(new Twig_Environment($this->getMock('Twig_LoaderInterface')));
+ $parser->parse($stream);
+ }
+
+ /**
+ * @expectedException Twig_Error_Syntax
+ * @expectedExceptionMessage Unknown "foobar" tag at line 1.
+ */
+ public function testUnknownTagWithoutSuggestions()
+ {
+ $stream = new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'foobar', 1),
+ new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
+ new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
+ ));
+ $parser = new Twig_Parser(new Twig_Environment($this->getMock('Twig_LoaderInterface')));
+ $parser->parse($stream);
+ }
+
+ /**
+ * @dataProvider getFilterBodyNodesData
+ */
+ public function testFilterBodyNodes($input, $expected)
+ {
+ $parser = $this->getParser();
+
+ $this->assertEquals($expected, $parser->filterBodyNodes($input));
+ }
+
+ public function getFilterBodyNodesData()
+ {
+ return array(
+ array(
+ new Twig_Node(array(new Twig_Node_Text(' ', 1))),
+ new Twig_Node(array()),
+ ),
+ array(
+ $input = new Twig_Node(array(new Twig_Node_Set(false, new Twig_Node(), new Twig_Node(), 1))),
+ $input,
+ ),
+ array(
+ $input = new Twig_Node(array(new Twig_Node_Set(true, new Twig_Node(), new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1))))), 1))),
+ $input,
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider getFilterBodyNodesDataThrowsException
+ * @expectedException Twig_Error_Syntax
+ */
+ public function testFilterBodyNodesThrowsException($input)
+ {
+ $parser = $this->getParser();
+
+ $parser->filterBodyNodes($input);
+ }
+
+ public function getFilterBodyNodesDataThrowsException()
+ {
+ return array(
+ array(new Twig_Node_Text('foo', 1)),
+ array(new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1)))))),
+ );
+ }
+
+ /**
+ * @expectedException Twig_Error_Syntax
+ * @expectedExceptionMessage A template that extends another one cannot have a body but a byte order mark (BOM) has been detected; it must be removed at line 1.
+ */
+ public function testFilterBodyNodesWithBOM()
+ {
+ $parser = $this->getParser();
+ $parser->filterBodyNodes(new Twig_Node_Text(chr(0xEF).chr(0xBB).chr(0xBF), 1));
+ }
+
+ public function testParseIsReentrant()
+ {
+ $twig = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array(
+ 'autoescape' => false,
+ 'optimizations' => 0,
+ ));
+ $twig->addTokenParser(new TestTokenParser());
+
+ $parser = new Twig_Parser($twig);
+
+ $parser->parse(new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'test', 1),
+ new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
+ new Twig_Token(Twig_Token::VAR_START_TYPE, '', 1),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1),
+ new Twig_Token(Twig_Token::VAR_END_TYPE, '', 1),
+ new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
+ )));
+
+ $this->assertNull($parser->getParent());
+ }
+
+ // The getVarName() must not depend on the template loaders,
+ // If this test does not throw any exception, that's good.
+ // see https://github.com/symfony/symfony/issues/4218
+ public function testGetVarName()
+ {
+ $twig = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array(
+ 'autoescape' => false,
+ 'optimizations' => 0,
+ ));
+
+ $twig->parse($twig->tokenize(<<getMock('Twig_LoaderInterface')));
+ $parser->setParent(new Twig_Node());
+ $parser->stream = $this->getMockBuilder('Twig_TokenStream')->disableOriginalConstructor()->getMock();
+
+ return $parser;
+ }
+}
+
+class TestParser extends Twig_Parser
+{
+ public $stream;
+
+ public function filterBodyNodes(Twig_NodeInterface $node)
+ {
+ return parent::filterBodyNodes($node);
+ }
+}
+
+class TestTokenParser extends Twig_TokenParser
+{
+ public function parse(Twig_Token $token)
+ {
+ // simulate the parsing of another template right in the middle of the parsing of the current template
+ $this->parser->parse(new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'extends', 1),
+ new Twig_Token(Twig_Token::STRING_TYPE, 'base', 1),
+ new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
+ new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
+ )));
+
+ $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+
+ return new Twig_Node(array());
+ }
+
+ public function getTag()
+ {
+ return 'test';
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
new file mode 100644
index 00000000..da97f478
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
@@ -0,0 +1,101 @@
+getMockBuilder('Twig_Profiler_Profile')->disableOriginalConstructor()->getMock();
+
+ $profile->expects($this->any())->method('isRoot')->will($this->returnValue(true));
+ $profile->expects($this->any())->method('getName')->will($this->returnValue('main'));
+ $profile->expects($this->any())->method('getDuration')->will($this->returnValue(1));
+ $profile->expects($this->any())->method('getMemoryUsage')->will($this->returnValue(0));
+ $profile->expects($this->any())->method('getPeakMemoryUsage')->will($this->returnValue(0));
+
+ $subProfiles = array(
+ $this->getIndexProfile(
+ array(
+ $this->getEmbeddedBlockProfile(),
+ $this->getEmbeddedTemplateProfile(
+ array(
+ $this->getIncludedTemplateProfile(),
+ )
+ ),
+ $this->getMacroProfile(),
+ $this->getEmbeddedTemplateProfile(
+ array(
+ $this->getIncludedTemplateProfile(),
+ )
+ ),
+ )
+ ),
+ );
+
+ $profile->expects($this->any())->method('getProfiles')->will($this->returnValue($subProfiles));
+ $profile->expects($this->any())->method('getIterator')->will($this->returnValue(new ArrayIterator($subProfiles)));
+
+ return $profile;
+ }
+
+ private function getIndexProfile(array $subProfiles = array())
+ {
+ return $this->generateProfile('main', 1, true, 'template', 'index.twig', $subProfiles);
+ }
+
+ private function getEmbeddedBlockProfile(array $subProfiles = array())
+ {
+ return $this->generateProfile('body', 0.0001, false, 'block', 'embedded.twig', $subProfiles);
+ }
+
+ private function getEmbeddedTemplateProfile(array $subProfiles = array())
+ {
+ return $this->generateProfile('main', 0.0001, true, 'template', 'embedded.twig', $subProfiles);
+ }
+
+ private function getIncludedTemplateProfile(array $subProfiles = array())
+ {
+ return $this->generateProfile('main', 0.0001, true, 'template', 'included.twig', $subProfiles);
+ }
+
+ private function getMacroProfile(array $subProfiles = array())
+ {
+ return $this->generateProfile('foo', 0.0001, false, 'macro', 'index.twig', $subProfiles);
+ }
+
+ /**
+ * @param string $name
+ * @param float $duration
+ * @param bool $isTemplate
+ * @param string $type
+ * @param string $templateName
+ * @param array $subProfiles
+ *
+ * @return Twig_Profiler_Profile
+ */
+ private function generateProfile($name, $duration, $isTemplate, $type, $templateName, array $subProfiles = array())
+ {
+ $profile = $this->getMockBuilder('Twig_Profiler_Profile')->disableOriginalConstructor()->getMock();
+
+ $profile->expects($this->any())->method('isRoot')->will($this->returnValue(false));
+ $profile->expects($this->any())->method('getName')->will($this->returnValue($name));
+ $profile->expects($this->any())->method('getDuration')->will($this->returnValue($duration));
+ $profile->expects($this->any())->method('getMemoryUsage')->will($this->returnValue(0));
+ $profile->expects($this->any())->method('getPeakMemoryUsage')->will($this->returnValue(0));
+ $profile->expects($this->any())->method('isTemplate')->will($this->returnValue($isTemplate));
+ $profile->expects($this->any())->method('getType')->will($this->returnValue($type));
+ $profile->expects($this->any())->method('getTemplate')->will($this->returnValue($templateName));
+ $profile->expects($this->any())->method('getProfiles')->will($this->returnValue($subProfiles));
+ $profile->expects($this->any())->method('getIterator')->will($this->returnValue(new ArrayIterator($subProfiles)));
+
+ return $profile;
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
new file mode 100644
index 00000000..1a1b9d29
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
@@ -0,0 +1,32 @@
+assertStringMatchesFormat(<<index.twig//1 %d %d %d
+index.twig==>embedded.twig::block(body)//1 %d %d 0
+index.twig==>embedded.twig//2 %d %d %d
+embedded.twig==>included.twig//2 %d %d %d
+index.twig==>index.twig::macro(foo)//1 %d %d %d
+EOF
+ , $dumper->dump($this->getProfile()));
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
new file mode 100644
index 00000000..66a68c4b
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
@@ -0,0 +1,30 @@
+assertStringMatchesFormat(<<main %d.%dms/%d%
+└ index.twig%d.%dms/%d%
+ └ embedded.twig::block(body)
+ └ embedded.twig
+ │ └ included.twig
+ └ index.twig::macro(foo)
+ └ embedded.twig
+ └ included.twig
+
+EOF
+ , $dumper->dump($this->getProfile()));
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
new file mode 100644
index 00000000..e2ea165a
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
@@ -0,0 +1,30 @@
+assertStringMatchesFormat(<<dump($this->getProfile()));
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
new file mode 100644
index 00000000..f786f06c
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
@@ -0,0 +1,100 @@
+assertEquals('template', $profile->getTemplate());
+ $this->assertEquals('type', $profile->getType());
+ $this->assertEquals('name', $profile->getName());
+ }
+
+ public function testIsRoot()
+ {
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+ $this->assertTrue($profile->isRoot());
+
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::TEMPLATE);
+ $this->assertFalse($profile->isRoot());
+ }
+
+ public function testIsTemplate()
+ {
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::TEMPLATE);
+ $this->assertTrue($profile->isTemplate());
+
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+ $this->assertFalse($profile->isTemplate());
+ }
+
+ public function testIsBlock()
+ {
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::BLOCK);
+ $this->assertTrue($profile->isBlock());
+
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+ $this->assertFalse($profile->isBlock());
+ }
+
+ public function testIsMacro()
+ {
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::MACRO);
+ $this->assertTrue($profile->isMacro());
+
+ $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+ $this->assertFalse($profile->isMacro());
+ }
+
+ public function testGetAddProfile()
+ {
+ $profile = new Twig_Profiler_Profile();
+ $profile->addProfile($a = new Twig_Profiler_Profile());
+ $profile->addProfile($b = new Twig_Profiler_Profile());
+
+ $this->assertSame(array($a, $b), $profile->getProfiles());
+ $this->assertSame(array($a, $b), iterator_to_array($profile));
+ }
+
+ public function testGetDuration()
+ {
+ $profile = new Twig_Profiler_Profile();
+ usleep(1);
+ $profile->leave();
+
+ $this->assertTrue($profile->getDuration() > 0, sprintf('Expected duration > 0, got: %f', $profile->getDuration()));
+ }
+
+ public function testSerialize()
+ {
+ $profile = new Twig_Profiler_Profile('template', 'type', 'name');
+ $profile1 = new Twig_Profiler_Profile('template1', 'type1', 'name1');
+ $profile->addProfile($profile1);
+ $profile->leave();
+ $profile1->leave();
+
+ $profile2 = unserialize(serialize($profile));
+ $profiles = $profile->getProfiles();
+ $this->assertCount(1, $profiles);
+ $profile3 = $profiles[0];
+
+ $this->assertEquals($profile->getTemplate(), $profile2->getTemplate());
+ $this->assertEquals($profile->getType(), $profile2->getType());
+ $this->assertEquals($profile->getName(), $profile2->getName());
+ $this->assertEquals($profile->getDuration(), $profile2->getDuration());
+
+ $this->assertEquals($profile1->getTemplate(), $profile3->getTemplate());
+ $this->assertEquals($profile1->getType(), $profile3->getType());
+ $this->assertEquals($profile1->getName(), $profile3->getName());
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/TemplateTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
new file mode 100644
index 00000000..f0146649
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
@@ -0,0 +1,693 @@
+getMockForAbstractClass('Twig_Template', array(), '', false);
+ $template->displayBlock('foo', array(), array('foo' => array(new stdClass(), 'foo')));
+ }
+
+ /**
+ * @dataProvider getAttributeExceptions
+ */
+ public function testGetAttributeExceptions($template, $message, $useExt)
+ {
+ $name = 'index_'.($useExt ? 1 : 0);
+ $templates = array(
+ $name => $template.$useExt, // appending $useExt makes the template content unique
+ );
+
+ $env = new Twig_Environment(new Twig_Loader_Array($templates), array('strict_variables' => true));
+ if (!$useExt) {
+ $env->addNodeVisitor(new CExtDisablingNodeVisitor());
+ }
+ $template = $env->loadTemplate($name);
+
+ $context = array(
+ 'string' => 'foo',
+ 'null' => null,
+ 'empty_array' => array(),
+ 'array' => array('foo' => 'foo'),
+ 'array_access' => new Twig_TemplateArrayAccessObject(),
+ 'magic_exception' => new Twig_TemplateMagicPropertyObjectWithException(),
+ 'object' => new stdClass(),
+ );
+
+ try {
+ $template->render($context);
+ $this->fail('Accessing an invalid attribute should throw an exception.');
+ } catch (Twig_Error_Runtime $e) {
+ $this->assertSame(sprintf($message, $name), $e->getMessage());
+ }
+ }
+
+ public function getAttributeExceptions()
+ {
+ $tests = array(
+ array('{{ string["a"] }}', 'Impossible to access a key ("a") on a string variable ("foo") in "%s" at line 1', false),
+ array('{{ null["a"] }}', 'Impossible to access a key ("a") on a null variable in "%s" at line 1', false),
+ array('{{ empty_array["a"] }}', 'Key "a" does not exist as the array is empty in "%s" at line 1', false),
+ array('{{ array["a"] }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1', false),
+ array('{{ array_access["a"] }}', 'Key "a" in object with ArrayAccess of class "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1', false),
+ array('{{ string.a }}', 'Impossible to access an attribute ("a") on a string variable ("foo") in "%s" at line 1', false),
+ array('{{ string.a() }}', 'Impossible to invoke a method ("a") on a string variable ("foo") in "%s" at line 1', false),
+ array('{{ null.a }}', 'Impossible to access an attribute ("a") on a null variable in "%s" at line 1', false),
+ array('{{ null.a() }}', 'Impossible to invoke a method ("a") on a null variable in "%s" at line 1', false),
+ array('{{ empty_array.a }}', 'Key "a" does not exist as the array is empty in "%s" at line 1', false),
+ array('{{ array.a }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1', false),
+ array('{{ attribute(array, -10) }}', 'Key "-10" for array with keys "foo" does not exist in "%s" at line 1', false),
+ array('{{ array_access.a }}', 'Method "a" for object "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1', false),
+ array('{% from _self import foo %}{% macro foo(obj) %}{{ obj.missing_method() }}{% endmacro %}{{ foo(array_access) }}', 'Method "missing_method" for object "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1', false),
+ array('{{ magic_exception.test }}', 'An exception has been thrown during the rendering of a template ("Hey! Don\'t try to isset me!") in "%s" at line 1.', false),
+ array('{{ object["a"] }}', 'Impossible to access a key "a" on an object of class "stdClass" that does not implement ArrayAccess interface in "%s" at line 1', false),
+ );
+
+ if (function_exists('twig_template_get_attributes')) {
+ foreach (array_slice($tests, 0) as $test) {
+ $test[2] = true;
+ $tests[] = $test;
+ }
+ }
+
+ return $tests;
+ }
+
+ public function testGetSource()
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface')), false);
+
+ $this->assertSame(" */*bar*/ ?>\n", $template->getSource());
+ }
+
+ /**
+ * @dataProvider getGetAttributeWithSandbox
+ */
+ public function testGetAttributeWithSandbox($object, $item, $allowed, $useExt)
+ {
+ $twig = new Twig_Environment($this->getMock('Twig_LoaderInterface'));
+ $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(/*method*/), array(/*prop*/), array());
+ $twig->addExtension(new Twig_Extension_Sandbox($policy, !$allowed));
+ $template = new Twig_TemplateTest($twig, $useExt);
+
+ try {
+ $template->getAttribute($object, $item, array(), 'any');
+
+ if (!$allowed) {
+ $this->fail();
+ }
+ } catch (Twig_Sandbox_SecurityError $e) {
+ if ($allowed) {
+ $this->fail();
+ }
+
+ $this->assertContains('is not allowed', $e->getMessage());
+ }
+ }
+
+ public function getGetAttributeWithSandbox()
+ {
+ $tests = array(
+ array(new Twig_TemplatePropertyObject(), 'defined', false, false),
+ array(new Twig_TemplatePropertyObject(), 'defined', true, false),
+ array(new Twig_TemplateMethodObject(), 'defined', false, false),
+ array(new Twig_TemplateMethodObject(), 'defined', true, false),
+ );
+
+ if (function_exists('twig_template_get_attributes')) {
+ foreach (array_slice($tests, 0) as $test) {
+ $test[3] = true;
+ $tests[] = $test;
+ }
+ }
+
+ return $tests;
+ }
+
+ /**
+ * @dataProvider getGetAttributeWithTemplateAsObject
+ */
+ public function testGetAttributeWithTemplateAsObject($useExt)
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface')), $useExt);
+ $template1 = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface')), false);
+
+ $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'string'));
+ $this->assertEquals('some_string', $template->getAttribute($template1, 'string'));
+
+ $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'true'));
+ $this->assertEquals('1', $template->getAttribute($template1, 'true'));
+
+ $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'zero'));
+ $this->assertEquals('0', $template->getAttribute($template1, 'zero'));
+
+ $this->assertNotInstanceof('Twig_Markup', $template->getAttribute($template1, 'empty'));
+ $this->assertSame('', $template->getAttribute($template1, 'empty'));
+
+ $this->assertFalse($template->getAttribute($template1, 'env', array(), Twig_Template::ANY_CALL, true));
+ $this->assertFalse($template->getAttribute($template1, 'environment', array(), Twig_Template::ANY_CALL, true));
+ $this->assertFalse($template->getAttribute($template1, 'getEnvironment', array(), Twig_Template::METHOD_CALL, true));
+ $this->assertFalse($template->getAttribute($template1, 'displayWithErrorHandling', array(), Twig_Template::METHOD_CALL, true));
+ }
+
+ public function getGetAttributeWithTemplateAsObject()
+ {
+ $bools = array(
+ array(false),
+ );
+
+ if (function_exists('twig_template_get_attributes')) {
+ $bools[] = array(true);
+ }
+
+ return $bools;
+ }
+
+ /**
+ * @dataProvider getTestsDependingOnExtensionAvailability
+ */
+ public function testGetAttributeOnArrayWithConfusableKey($useExt = false)
+ {
+ $template = new Twig_TemplateTest(
+ new Twig_Environment($this->getMock('Twig_LoaderInterface')),
+ $useExt
+ );
+
+ $array = array('Zero', 'One', -1 => 'MinusOne', '' => 'EmptyString', '1.5' => 'FloatButString', '01' => 'IntegerButStringWithLeadingZeros');
+
+ $this->assertSame('Zero', $array[false]);
+ $this->assertSame('One', $array[true]);
+ $this->assertSame('One', $array[1.5]);
+ $this->assertSame('One', $array['1']);
+ $this->assertSame('MinusOne', $array[-1.5]);
+ $this->assertSame('FloatButString', $array['1.5']);
+ $this->assertSame('IntegerButStringWithLeadingZeros', $array['01']);
+ $this->assertSame('EmptyString', $array[null]);
+
+ $this->assertSame('Zero', $template->getAttribute($array, false), 'false is treated as 0 when accessing an array (equals PHP behavior)');
+ $this->assertSame('One', $template->getAttribute($array, true), 'true is treated as 1 when accessing an array (equals PHP behavior)');
+ $this->assertSame('One', $template->getAttribute($array, 1.5), 'float is casted to int when accessing an array (equals PHP behavior)');
+ $this->assertSame('One', $template->getAttribute($array, '1'), '"1" is treated as integer 1 when accessing an array (equals PHP behavior)');
+ $this->assertSame('MinusOne', $template->getAttribute($array, -1.5), 'negative float is casted to int when accessing an array (equals PHP behavior)');
+ $this->assertSame('FloatButString', $template->getAttribute($array, '1.5'), '"1.5" is treated as-is when accessing an array (equals PHP behavior)');
+ $this->assertSame('IntegerButStringWithLeadingZeros', $template->getAttribute($array, '01'), '"01" is treated as-is when accessing an array (equals PHP behavior)');
+ $this->assertSame('EmptyString', $template->getAttribute($array, null), 'null is treated as "" when accessing an array (equals PHP behavior)');
+ }
+
+ public function getTestsDependingOnExtensionAvailability()
+ {
+ if (function_exists('twig_template_get_attributes')) {
+ return array(array(false), array(true));
+ }
+
+ return array(array(false));
+ }
+
+ /**
+ * @dataProvider getGetAttributeTests
+ */
+ public function testGetAttribute($defined, $value, $object, $item, $arguments, $type, $useExt = false)
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface')), $useExt);
+
+ $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
+ }
+
+ /**
+ * @dataProvider getGetAttributeTests
+ */
+ public function testGetAttributeStrict($defined, $value, $object, $item, $arguments, $type, $useExt = false, $exceptionMessage = null)
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('strict_variables' => true)), $useExt);
+
+ if ($defined) {
+ $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
+ } else {
+ try {
+ $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
+
+ throw new Exception('Expected Twig_Error_Runtime exception.');
+ } catch (Twig_Error_Runtime $e) {
+ if (null !== $exceptionMessage) {
+ $this->assertSame($exceptionMessage, $e->getMessage());
+ }
+ }
+ }
+ }
+
+ /**
+ * @dataProvider getGetAttributeTests
+ */
+ public function testGetAttributeDefined($defined, $value, $object, $item, $arguments, $type, $useExt = false)
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface')), $useExt);
+
+ $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true));
+ }
+
+ /**
+ * @dataProvider getGetAttributeTests
+ */
+ public function testGetAttributeDefinedStrict($defined, $value, $object, $item, $arguments, $type, $useExt = false)
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('strict_variables' => true)), $useExt);
+
+ $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true));
+ }
+
+ /**
+ * @dataProvider getTestsDependingOnExtensionAvailability
+ */
+ public function testGetAttributeCallExceptions($useExt = false)
+ {
+ $template = new Twig_TemplateTest(new Twig_Environment($this->getMock('Twig_LoaderInterface')), $useExt);
+
+ $object = new Twig_TemplateMagicMethodExceptionObject();
+
+ $this->assertNull($template->getAttribute($object, 'foo'));
+ }
+
+ public function getGetAttributeTests()
+ {
+ $array = array(
+ 'defined' => 'defined',
+ 'zero' => 0,
+ 'null' => null,
+ '1' => 1,
+ 'bar' => true,
+ '09' => '09',
+ '+4' => '+4',
+ );
+
+ $objectArray = new Twig_TemplateArrayAccessObject();
+ $stdObject = (object) $array;
+ $magicPropertyObject = new Twig_TemplateMagicPropertyObject();
+ $propertyObject = new Twig_TemplatePropertyObject();
+ $propertyObject1 = new Twig_TemplatePropertyObjectAndIterator();
+ $propertyObject2 = new Twig_TemplatePropertyObjectAndArrayAccess();
+ $propertyObject3 = new Twig_TemplatePropertyObjectDefinedWithUndefinedValue();
+ $methodObject = new Twig_TemplateMethodObject();
+ $magicMethodObject = new Twig_TemplateMagicMethodObject();
+
+ $anyType = Twig_Template::ANY_CALL;
+ $methodType = Twig_Template::METHOD_CALL;
+ $arrayType = Twig_Template::ARRAY_CALL;
+
+ $basicTests = array(
+ // array(defined, value, property to fetch)
+ array(true, 'defined', 'defined'),
+ array(false, null, 'undefined'),
+ array(false, null, 'protected'),
+ array(true, 0, 'zero'),
+ array(true, 1, 1),
+ array(true, 1, 1.0),
+ array(true, null, 'null'),
+ array(true, true, 'bar'),
+ array(true, '09', '09'),
+ array(true, '+4', '+4'),
+ );
+ $testObjects = array(
+ // array(object, type of fetch)
+ array($array, $arrayType),
+ array($objectArray, $arrayType),
+ array($stdObject, $anyType),
+ array($magicPropertyObject, $anyType),
+ array($methodObject, $methodType),
+ array($methodObject, $anyType),
+ array($propertyObject, $anyType),
+ array($propertyObject1, $anyType),
+ array($propertyObject2, $anyType),
+ );
+
+ $tests = array();
+ foreach ($testObjects as $testObject) {
+ foreach ($basicTests as $test) {
+ // properties cannot be numbers
+ if (($testObject[0] instanceof stdClass || $testObject[0] instanceof Twig_TemplatePropertyObject) && is_numeric($test[2])) {
+ continue;
+ }
+
+ if ('+4' === $test[2] && $methodObject === $testObject[0]) {
+ continue;
+ }
+
+ $tests[] = array($test[0], $test[1], $testObject[0], $test[2], array(), $testObject[1]);
+ }
+ }
+
+ // additional properties tests
+ $tests = array_merge($tests, array(
+ array(true, null, $propertyObject3, 'foo', array(), $anyType),
+ ));
+
+ // additional method tests
+ $tests = array_merge($tests, array(
+ array(true, 'defined', $methodObject, 'defined', array(), $methodType),
+ array(true, 'defined', $methodObject, 'DEFINED', array(), $methodType),
+ array(true, 'defined', $methodObject, 'getDefined', array(), $methodType),
+ array(true, 'defined', $methodObject, 'GETDEFINED', array(), $methodType),
+ array(true, 'static', $methodObject, 'static', array(), $methodType),
+ array(true, 'static', $methodObject, 'getStatic', array(), $methodType),
+
+ array(true, '__call_undefined', $magicMethodObject, 'undefined', array(), $methodType),
+ array(true, '__call_UNDEFINED', $magicMethodObject, 'UNDEFINED', array(), $methodType),
+ ));
+
+ // add the same tests for the any type
+ foreach ($tests as $test) {
+ if ($anyType !== $test[5]) {
+ $test[5] = $anyType;
+ $tests[] = $test;
+ }
+ }
+
+ $methodAndPropObject = new Twig_TemplateMethodAndPropObject();
+
+ // additional method tests
+ $tests = array_merge($tests, array(
+ array(true, 'a', $methodAndPropObject, 'a', array(), $anyType),
+ array(true, 'a', $methodAndPropObject, 'a', array(), $methodType),
+ array(false, null, $methodAndPropObject, 'a', array(), $arrayType),
+
+ array(true, 'b_prop', $methodAndPropObject, 'b', array(), $anyType),
+ array(true, 'b', $methodAndPropObject, 'B', array(), $anyType),
+ array(true, 'b', $methodAndPropObject, 'b', array(), $methodType),
+ array(true, 'b', $methodAndPropObject, 'B', array(), $methodType),
+ array(false, null, $methodAndPropObject, 'b', array(), $arrayType),
+
+ array(false, null, $methodAndPropObject, 'c', array(), $anyType),
+ array(false, null, $methodAndPropObject, 'c', array(), $methodType),
+ array(false, null, $methodAndPropObject, 'c', array(), $arrayType),
+
+ ));
+
+ // tests when input is not an array or object
+ $tests = array_merge($tests, array(
+ array(false, null, 42, 'a', array(), $anyType, false, 'Impossible to access an attribute ("a") on a integer variable ("42")'),
+ array(false, null, 'string', 'a', array(), $anyType, false, 'Impossible to access an attribute ("a") on a string variable ("string")'),
+ array(false, null, array(), 'a', array(), $anyType, false, 'Key "a" does not exist as the array is empty'),
+ ));
+
+ // add twig_template_get_attributes tests
+
+ if (function_exists('twig_template_get_attributes')) {
+ foreach (array_slice($tests, 0) as $test) {
+ $test = array_pad($test, 7, null);
+ $test[6] = true;
+ $tests[] = $test;
+ }
+ }
+
+ return $tests;
+ }
+}
+
+class Twig_TemplateTest extends Twig_Template
+{
+ protected $useExtGetAttribute = false;
+
+ public function __construct(Twig_Environment $env, $useExtGetAttribute = false)
+ {
+ parent::__construct($env);
+ $this->useExtGetAttribute = $useExtGetAttribute;
+ self::$cache = array();
+ }
+
+ public function getZero()
+ {
+ return 0;
+ }
+
+ public function getEmpty()
+ {
+ return '';
+ }
+
+ public function getString()
+ {
+ return 'some_string';
+ }
+
+ public function getTrue()
+ {
+ return true;
+ }
+
+ public function getTemplateName()
+ {
+ }
+
+ public function getDebugInfo()
+ {
+ return array();
+ }
+
+ protected function doGetParent(array $context)
+ {
+ }
+
+ protected function doDisplay(array $context, array $blocks = array())
+ {
+ }
+
+ public function getAttribute($object, $item, array $arguments = array(), $type = Twig_Template::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
+ {
+ if ($this->useExtGetAttribute) {
+ return twig_template_get_attributes($this, $object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
+ } else {
+ return parent::getAttribute($object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
+ }
+ }
+}
+/* *//* *bar*//* ?>*/
+/* */
+
+class Twig_TemplateArrayAccessObject implements ArrayAccess
+{
+ protected $protected = 'protected';
+
+ public $attributes = array(
+ 'defined' => 'defined',
+ 'zero' => 0,
+ 'null' => null,
+ '1' => 1,
+ 'bar' => true,
+ '09' => '09',
+ '+4' => '+4',
+ );
+
+ public function offsetExists($name)
+ {
+ return array_key_exists($name, $this->attributes);
+ }
+
+ public function offsetGet($name)
+ {
+ return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
+ }
+
+ public function offsetSet($name, $value)
+ {
+ }
+
+ public function offsetUnset($name)
+ {
+ }
+}
+
+class Twig_TemplateMagicPropertyObject
+{
+ public $defined = 'defined';
+
+ public $attributes = array(
+ 'zero' => 0,
+ 'null' => null,
+ '1' => 1,
+ 'bar' => true,
+ '09' => '09',
+ '+4' => '+4',
+ );
+
+ protected $protected = 'protected';
+
+ public function __isset($name)
+ {
+ return array_key_exists($name, $this->attributes);
+ }
+
+ public function __get($name)
+ {
+ return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
+ }
+}
+
+class Twig_TemplateMagicPropertyObjectWithException
+{
+ public function __isset($key)
+ {
+ throw new Exception('Hey! Don\'t try to isset me!');
+ }
+}
+
+class Twig_TemplatePropertyObject
+{
+ public $defined = 'defined';
+ public $zero = 0;
+ public $null = null;
+ public $bar = true;
+
+ protected $protected = 'protected';
+}
+
+class Twig_TemplatePropertyObjectAndIterator extends Twig_TemplatePropertyObject implements IteratorAggregate
+{
+ public function getIterator()
+ {
+ return new ArrayIterator(array('foo', 'bar'));
+ }
+}
+
+class Twig_TemplatePropertyObjectAndArrayAccess extends Twig_TemplatePropertyObject implements ArrayAccess
+{
+ private $data = array();
+
+ public function offsetExists($offset)
+ {
+ return array_key_exists($offset, $this->data);
+ }
+
+ public function offsetGet($offset)
+ {
+ return $this->offsetExists($offset) ? $this->data[$offset] : 'n/a';
+ }
+
+ public function offsetSet($offset, $value)
+ {
+ }
+
+ public function offsetUnset($offset)
+ {
+ }
+}
+
+class Twig_TemplatePropertyObjectDefinedWithUndefinedValue
+{
+ public $foo;
+
+ public function __construct()
+ {
+ $this->foo = @$notExist;
+ }
+}
+
+class Twig_TemplateMethodObject
+{
+ public function getDefined()
+ {
+ return 'defined';
+ }
+
+ public function get1()
+ {
+ return 1;
+ }
+
+ public function get09()
+ {
+ return '09';
+ }
+
+ public function getZero()
+ {
+ return 0;
+ }
+
+ public function getNull()
+ {
+ }
+
+ public function isBar()
+ {
+ return true;
+ }
+
+ protected function getProtected()
+ {
+ return 'protected';
+ }
+
+ public static function getStatic()
+ {
+ return 'static';
+ }
+}
+
+class Twig_TemplateMethodAndPropObject
+{
+ private $a = 'a_prop';
+ public function getA()
+ {
+ return 'a';
+ }
+
+ public $b = 'b_prop';
+ public function getB()
+ {
+ return 'b';
+ }
+
+ private $c = 'c_prop';
+ private function getC()
+ {
+ return 'c';
+ }
+}
+
+class Twig_TemplateMagicMethodObject
+{
+ public function __call($method, $arguments)
+ {
+ return '__call_'.$method;
+ }
+}
+
+class Twig_TemplateMagicMethodExceptionObject
+{
+ public function __call($method, $arguments)
+ {
+ throw new BadMethodCallException(sprintf('Unknown method "%s".', $method));
+ }
+}
+
+class CExtDisablingNodeVisitor implements Twig_NodeVisitorInterface
+{
+ public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
+ {
+ if ($node instanceof Twig_Node_Expression_GetAttr) {
+ $node->setAttribute('disable_c_ext', true);
+ }
+
+ return $node;
+ }
+
+ public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
+ {
+ return $node;
+ }
+
+ public function getPriority()
+ {
+ return 0;
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
new file mode 100644
index 00000000..5ac3a286
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
@@ -0,0 +1,70 @@
+isEOF()) {
+ $token = $stream->next();
+
+ $repr[] = $token->getValue();
+ }
+ $this->assertEquals('1, 2, 3, 4, 5, 6, 7', implode(', ', $repr), '->next() advances the pointer and returns the current token');
+ }
+
+ /**
+ * @expectedException Twig_Error_Syntax
+ * @expectedMessage Unexpected end of template
+ */
+ public function testEndOfTemplateNext()
+ {
+ $stream = new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
+ ));
+ while (!$stream->isEOF()) {
+ $stream->next();
+ }
+ }
+
+ /**
+ * @expectedException Twig_Error_Syntax
+ * @expectedMessage Unexpected end of template
+ */
+ public function testEndOfTemplateLook()
+ {
+ $stream = new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
+ ));
+ while (!$stream->isEOF()) {
+ $stream->look();
+ $stream->next();
+ }
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/Twig/Tests/escapingTest.php b/plugins/twig/vendor/twig/twig/test/Twig/Tests/escapingTest.php
new file mode 100644
index 00000000..abf62364
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/Twig/Tests/escapingTest.php
@@ -0,0 +1,320 @@
+ ''',
+ '"' => '"',
+ '<' => '<',
+ '>' => '>',
+ '&' => '&',
+ );
+
+ protected $htmlAttrSpecialChars = array(
+ '\'' => ''',
+ /* Characters beyond ASCII value 255 to unicode escape */
+ 'Ā' => 'Ā',
+ /* Immune chars excluded */
+ ',' => ',',
+ '.' => '.',
+ '-' => '-',
+ '_' => '_',
+ /* Basic alnums excluded */
+ 'a' => 'a',
+ 'A' => 'A',
+ 'z' => 'z',
+ 'Z' => 'Z',
+ '0' => '0',
+ '9' => '9',
+ /* Basic control characters and null */
+ "\r" => '
',
+ "\n" => '
',
+ "\t" => ' ',
+ "\0" => '�', // should use Unicode replacement char
+ /* Encode chars as named entities where possible */
+ '<' => '<',
+ '>' => '>',
+ '&' => '&',
+ '"' => '"',
+ /* Encode spaces for quoteless attribute protection */
+ ' ' => ' ',
+ );
+
+ protected $jsSpecialChars = array(
+ /* HTML special chars - escape without exception to hex */
+ '<' => '\\x3C',
+ '>' => '\\x3E',
+ '\'' => '\\x27',
+ '"' => '\\x22',
+ '&' => '\\x26',
+ /* Characters beyond ASCII value 255 to unicode escape */
+ 'Ā' => '\\u0100',
+ /* Immune chars excluded */
+ ',' => ',',
+ '.' => '.',
+ '_' => '_',
+ /* Basic alnums excluded */
+ 'a' => 'a',
+ 'A' => 'A',
+ 'z' => 'z',
+ 'Z' => 'Z',
+ '0' => '0',
+ '9' => '9',
+ /* Basic control characters and null */
+ "\r" => '\\x0D',
+ "\n" => '\\x0A',
+ "\t" => '\\x09',
+ "\0" => '\\x00',
+ /* Encode spaces for quoteless attribute protection */
+ ' ' => '\\x20',
+ );
+
+ protected $urlSpecialChars = array(
+ /* HTML special chars - escape without exception to percent encoding */
+ '<' => '%3C',
+ '>' => '%3E',
+ '\'' => '%27',
+ '"' => '%22',
+ '&' => '%26',
+ /* Characters beyond ASCII value 255 to hex sequence */
+ 'Ā' => '%C4%80',
+ /* Punctuation and unreserved check */
+ ',' => '%2C',
+ '.' => '.',
+ '_' => '_',
+ '-' => '-',
+ ':' => '%3A',
+ ';' => '%3B',
+ '!' => '%21',
+ /* Basic alnums excluded */
+ 'a' => 'a',
+ 'A' => 'A',
+ 'z' => 'z',
+ 'Z' => 'Z',
+ '0' => '0',
+ '9' => '9',
+ /* Basic control characters and null */
+ "\r" => '%0D',
+ "\n" => '%0A',
+ "\t" => '%09',
+ "\0" => '%00',
+ /* PHP quirks from the past */
+ ' ' => '%20',
+ '~' => '~',
+ '+' => '%2B',
+ );
+
+ protected $cssSpecialChars = array(
+ /* HTML special chars - escape without exception to hex */
+ '<' => '\\3C ',
+ '>' => '\\3E ',
+ '\'' => '\\27 ',
+ '"' => '\\22 ',
+ '&' => '\\26 ',
+ /* Characters beyond ASCII value 255 to unicode escape */
+ 'Ā' => '\\100 ',
+ /* Immune chars excluded */
+ ',' => '\\2C ',
+ '.' => '\\2E ',
+ '_' => '\\5F ',
+ /* Basic alnums excluded */
+ 'a' => 'a',
+ 'A' => 'A',
+ 'z' => 'z',
+ 'Z' => 'Z',
+ '0' => '0',
+ '9' => '9',
+ /* Basic control characters and null */
+ "\r" => '\\D ',
+ "\n" => '\\A ',
+ "\t" => '\\9 ',
+ "\0" => '\\0 ',
+ /* Encode spaces for quoteless attribute protection */
+ ' ' => '\\20 ',
+ );
+
+ protected $env;
+
+ protected function setUp()
+ {
+ $this->env = new Twig_Environment($this->getMock('Twig_LoaderInterface'));
+ }
+
+ public function testHtmlEscapingConvertsSpecialChars()
+ {
+ foreach ($this->htmlSpecialChars as $key => $value) {
+ $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html'), 'Failed to escape: '.$key);
+ }
+ }
+
+ public function testHtmlAttributeEscapingConvertsSpecialChars()
+ {
+ foreach ($this->htmlAttrSpecialChars as $key => $value) {
+ $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html_attr'), 'Failed to escape: '.$key);
+ }
+ }
+
+ public function testJavascriptEscapingConvertsSpecialChars()
+ {
+ foreach ($this->jsSpecialChars as $key => $value) {
+ $this->assertEquals($value, twig_escape_filter($this->env, $key, 'js'), 'Failed to escape: '.$key);
+ }
+ }
+
+ public function testJavascriptEscapingReturnsStringIfZeroLength()
+ {
+ $this->assertEquals('', twig_escape_filter($this->env, '', 'js'));
+ }
+
+ public function testJavascriptEscapingReturnsStringIfContainsOnlyDigits()
+ {
+ $this->assertEquals('123', twig_escape_filter($this->env, '123', 'js'));
+ }
+
+ public function testCssEscapingConvertsSpecialChars()
+ {
+ foreach ($this->cssSpecialChars as $key => $value) {
+ $this->assertEquals($value, twig_escape_filter($this->env, $key, 'css'), 'Failed to escape: '.$key);
+ }
+ }
+
+ public function testCssEscapingReturnsStringIfZeroLength()
+ {
+ $this->assertEquals('', twig_escape_filter($this->env, '', 'css'));
+ }
+
+ public function testCssEscapingReturnsStringIfContainsOnlyDigits()
+ {
+ $this->assertEquals('123', twig_escape_filter($this->env, '123', 'css'));
+ }
+
+ public function testUrlEscapingConvertsSpecialChars()
+ {
+ foreach ($this->urlSpecialChars as $key => $value) {
+ $this->assertEquals($value, twig_escape_filter($this->env, $key, 'url'), 'Failed to escape: '.$key);
+ }
+ }
+
+ /**
+ * Range tests to confirm escaped range of characters is within OWASP recommendation.
+ */
+
+ /**
+ * Only testing the first few 2 ranges on this prot. function as that's all these
+ * other range tests require.
+ */
+ public function testUnicodeCodepointConversionToUtf8()
+ {
+ $expected = ' ~ޙ';
+ $codepoints = array(0x20, 0x7e, 0x799);
+ $result = '';
+ foreach ($codepoints as $value) {
+ $result .= $this->codepointToUtf8($value);
+ }
+ $this->assertEquals($expected, $result);
+ }
+
+ /**
+ * Convert a Unicode Codepoint to a literal UTF-8 character.
+ *
+ * @param int $codepoint Unicode codepoint in hex notation
+ *
+ * @return string UTF-8 literal string
+ */
+ protected function codepointToUtf8($codepoint)
+ {
+ if ($codepoint < 0x80) {
+ return chr($codepoint);
+ }
+ if ($codepoint < 0x800) {
+ return chr($codepoint >> 6 & 0x3f | 0xc0)
+ .chr($codepoint & 0x3f | 0x80);
+ }
+ if ($codepoint < 0x10000) {
+ return chr($codepoint >> 12 & 0x0f | 0xe0)
+ .chr($codepoint >> 6 & 0x3f | 0x80)
+ .chr($codepoint & 0x3f | 0x80);
+ }
+ if ($codepoint < 0x110000) {
+ return chr($codepoint >> 18 & 0x07 | 0xf0)
+ .chr($codepoint >> 12 & 0x3f | 0x80)
+ .chr($codepoint >> 6 & 0x3f | 0x80)
+ .chr($codepoint & 0x3f | 0x80);
+ }
+ throw new Exception('Codepoint requested outside of Unicode range');
+ }
+
+ public function testJavascriptEscapingEscapesOwaspRecommendedRanges()
+ {
+ $immune = array(',', '.', '_'); // Exceptions to escaping ranges
+ for ($chr = 0; $chr < 0xFF; ++$chr) {
+ if ($chr >= 0x30 && $chr <= 0x39
+ || $chr >= 0x41 && $chr <= 0x5A
+ || $chr >= 0x61 && $chr <= 0x7A) {
+ $literal = $this->codepointToUtf8($chr);
+ $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js'));
+ } else {
+ $literal = $this->codepointToUtf8($chr);
+ if (in_array($literal, $immune)) {
+ $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js'));
+ } else {
+ $this->assertNotEquals(
+ $literal,
+ twig_escape_filter($this->env, $literal, 'js'),
+ "$literal should be escaped!");
+ }
+ }
+ }
+ }
+
+ public function testHtmlAttributeEscapingEscapesOwaspRecommendedRanges()
+ {
+ $immune = array(',', '.', '-', '_'); // Exceptions to escaping ranges
+ for ($chr = 0; $chr < 0xFF; ++$chr) {
+ if ($chr >= 0x30 && $chr <= 0x39
+ || $chr >= 0x41 && $chr <= 0x5A
+ || $chr >= 0x61 && $chr <= 0x7A) {
+ $literal = $this->codepointToUtf8($chr);
+ $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr'));
+ } else {
+ $literal = $this->codepointToUtf8($chr);
+ if (in_array($literal, $immune)) {
+ $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr'));
+ } else {
+ $this->assertNotEquals(
+ $literal,
+ twig_escape_filter($this->env, $literal, 'html_attr'),
+ "$literal should be escaped!");
+ }
+ }
+ }
+ }
+
+ public function testCssEscapingEscapesOwaspRecommendedRanges()
+ {
+ // CSS has no exceptions to escaping ranges
+ for ($chr = 0; $chr < 0xFF; ++$chr) {
+ if ($chr >= 0x30 && $chr <= 0x39
+ || $chr >= 0x41 && $chr <= 0x5A
+ || $chr >= 0x61 && $chr <= 0x7A) {
+ $literal = $this->codepointToUtf8($chr);
+ $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'css'));
+ } else {
+ $literal = $this->codepointToUtf8($chr);
+ $this->assertNotEquals(
+ $literal,
+ twig_escape_filter($this->env, $literal, 'css'),
+ "$literal should be escaped!");
+ }
+ }
+ }
+}
diff --git a/plugins/twig/vendor/twig/twig/test/bootstrap.php b/plugins/twig/vendor/twig/twig/test/bootstrap.php
new file mode 100644
index 00000000..aecb976f
--- /dev/null
+++ b/plugins/twig/vendor/twig/twig/test/bootstrap.php
@@ -0,0 +1,13 @@
+
Date: Thu, 3 Mar 2016 12:52:42 +0100
Subject: [PATCH 02/17] [BUGFIX] SensioLabsInsight: Files should not be
executable Your project contains files with permissive permissions. In order
to avoid opening a security breach, you should restrict execution rights on
following files:
system/Http/Request.php
system/Http/Response.php
---
system/Http/Request.php | 0
system/Http/Response.php | 0
2 files changed, 0 insertions(+), 0 deletions(-)
mode change 100755 => 100644 system/Http/Request.php
mode change 100755 => 100644 system/Http/Response.php
diff --git a/system/Http/Request.php b/system/Http/Request.php
old mode 100755
new mode 100644
diff --git a/system/Http/Response.php b/system/Http/Response.php
old mode 100755
new mode 100644
From 649510de472584bf3a09c51ed4d72a0cf0f7c1c7 Mon Sep 17 00:00:00 2001
From: Netzweberei
Date: Thu, 3 Mar 2016 17:49:37 +0100
Subject: [PATCH 03/17] [CHANGE] camelCasedMethodNames, psr1
As suggested by SensioLabsInsight
---
plugins/shortcode/shortcode.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/plugins/shortcode/shortcode.php b/plugins/shortcode/shortcode.php
index 010fed9a..0882d935 100644
--- a/plugins/shortcode/shortcode.php
+++ b/plugins/shortcode/shortcode.php
@@ -387,13 +387,13 @@ protected function getFileInfo($path)
return '';
}
$replace = [
- '{size}' => $this->human_filesize(filesize($path)),
+ '{size}' => $this->humanFilesize(filesize($path)),
'{extension}' => strtoupper(pathinfo($path, PATHINFO_EXTENSION))
];
return strtr(' ({extension}, {size})', $replace);
}
- protected function human_filesize($bytes, $decimals = 0)
+ protected function humanFilesize($bytes, $decimals = 0)
{
$sz = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
$factor = floor((strlen($bytes) - 1) / 3);
From 525701b15125a1920f2f338b31ddad87848bdde1 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 08:28:59 +0100
Subject: [PATCH 04/17] [CHANGE] SensioLabsInsight: Object parameters should be
type hinted
---
plugins/markdown/markdown.php | 4 ++--
plugins/shortcode/shortcode.php | 2 +-
plugins/textile/textile.php | 8 ++++----
plugins/twig/classes/HerbieExtension.php | 4 ++--
plugins/twig/twig.php | 2 +-
system/Menu/CollectionTrait.php | 4 ++--
system/Menu/Page/Iterator/FilterCallback.php | 2 +-
system/Menu/Page/Iterator/SortableIterator.php | 10 +++++-----
8 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/plugins/markdown/markdown.php b/plugins/markdown/markdown.php
index a09c5480..7e4d5f47 100644
--- a/plugins/markdown/markdown.php
+++ b/plugins/markdown/markdown.php
@@ -12,7 +12,7 @@ public static function install()
// add twig function / filter
if ((bool)$config->get('plugins.config.markdown.twig', false)) {
- Hook::attach('twigInitialized', function($twig) {
+ Hook::attach('twigInitialized', function(\Twig_Environment $twig) {
$options = ['is_safe' => ['html']];
$twig->addFunction(
new \Twig_SimpleFunction('markdown', ['MarkdownPlugin', 'parseMarkdown'], $options)
@@ -40,7 +40,7 @@ public static function install()
});
}
- public static function addShortcode($shortcode)
+ public static function addShortcode(\herbie\sysplugin\shortcode\classes\Shortcode $shortcode)
{
$shortcode->add('markdown', ['MarkdownPlugin', 'markdownShortcode']);
}
diff --git a/plugins/shortcode/shortcode.php b/plugins/shortcode/shortcode.php
index 54f009d9..6eb79bc5 100644
--- a/plugins/shortcode/shortcode.php
+++ b/plugins/shortcode/shortcode.php
@@ -163,7 +163,7 @@ protected function addListingTag()
}
// filter pages with empty title
- $collection = $collection->filter(function ($page) {
+ $collection = $collection->filter(function (\Herbie\Page $page) {
return !empty($page->title);
});
diff --git a/plugins/textile/textile.php b/plugins/textile/textile.php
index 3c937573..5d5967e1 100644
--- a/plugins/textile/textile.php
+++ b/plugins/textile/textile.php
@@ -20,7 +20,7 @@ public function install()
Hook::attach('renderContent', [$this, 'renderContent']);
}
- public function addTwigFunctionAndFilter($twig)
+ public function addTwigFunctionAndFilter(\Twig_Environment $twig)
{
$options = ['is_safe' => ['html']];
$twig->addFunction(
@@ -31,17 +31,17 @@ public function addTwigFunctionAndFilter($twig)
);
}
- public function addSortcode($shortcode)
+ public function addSortcode(herbie\sysplugin\shortcode\classes\Shortcode $shortcode)
{
$shortcode->add('textile', [$this, 'textileShortcode']);
}
- public function renderContent($segment, array $attributes)
+ public function renderContent( $segment, array $attributes)
{
if(!in_array($attributes['format'], ['textile'])) {
return $segment;
}
- return $this->parseTextile($segment->string);
+ return $this->parseTextile($segment);
}
public function parseTextile($value)
diff --git a/plugins/twig/classes/HerbieExtension.php b/plugins/twig/classes/HerbieExtension.php
index b54fd4e3..592d2423 100644
--- a/plugins/twig/classes/HerbieExtension.php
+++ b/plugins/twig/classes/HerbieExtension.php
@@ -443,7 +443,7 @@ public function functionMenu(array $options = [])
$htmlTree = new Menu\Page\Renderer\HtmlTree($filterIterator);
$htmlTree->setMaxDepth($maxDepth);
$htmlTree->setClass($class);
- $htmlTree->itemCallback = function ($node) {
+ $htmlTree->itemCallback = function (\Herbie\Node $node) {
$menuItem = $node->getMenuItem();
$href = $this->urlGenerator->generate($menuItem->route);
return sprintf('%s', $href, $menuItem->getMenuTitle());
@@ -594,7 +594,7 @@ public function functionSitemap(array $options = [])
$htmlTree = new Menu\Page\Renderer\HtmlTree($filterIterator);
$htmlTree->setMaxDepth($maxDepth);
$htmlTree->setClass($class);
- $htmlTree->itemCallback = function ($node) {
+ $htmlTree->itemCallback = function (\Herbie\Node $node) {
$menuItem = $node->getMenuItem();
$href = $this->urlGenerator->generate($menuItem->route);
return sprintf('%s', $href, $menuItem->getMenuTitle());
diff --git a/plugins/twig/twig.php b/plugins/twig/twig.php
index bbffabf4..eeb974b7 100644
--- a/plugins/twig/twig.php
+++ b/plugins/twig/twig.php
@@ -39,7 +39,7 @@ public function twigifyContent($content, array $attributes)
return $this->twig->renderString($content);
}
- public function twigifyLayout($page)
+ public function twigifyLayout(\Herbie\Page $page)
{
$this->twig->getEnvironment()->getExtension('herbie')->setPage($page);
return $this->twig->render($page->layout);
diff --git a/system/Menu/CollectionTrait.php b/system/Menu/CollectionTrait.php
index 584ed373..4216b6de 100644
--- a/system/Menu/CollectionTrait.php
+++ b/system/Menu/CollectionTrait.php
@@ -107,7 +107,7 @@ public function filter($key = null, $value = null)
return new static(array_filter($this->items, $key));
}
if (is_string($key) && is_scalar($value)) {
- return new static(array_filter($this->items, function($val) use ($key, $value) {
+ return new static(array_filter($this->items, function(\stdClass $val) use ($key, $value) {
if ($val->{$key} == $value) {
return true;
}
@@ -149,7 +149,7 @@ public function sort($mixed = null, $direction = 'asc')
}
$field = is_string($mixed) ? $mixed : 'title';
- uasort($items, function($a, $b) use ($field, $direction) {
+ uasort($items, function(\stdClass $a, \stdClass $b) use ($field, $direction) {
if ($a->{$field} == $b->{$field}) {
return 0;
}
diff --git a/system/Menu/Page/Iterator/FilterCallback.php b/system/Menu/Page/Iterator/FilterCallback.php
index 867bb311..893ff8f2 100644
--- a/system/Menu/Page/Iterator/FilterCallback.php
+++ b/system/Menu/Page/Iterator/FilterCallback.php
@@ -24,7 +24,7 @@ public function __construct(array $routeLine)
$this->routeLine = $routeLine;
}
- public function call($current, $key, $iterator)
+ public function call(\Herbie\Menu\Page\Node $current, $key, $iterator)
{
$menuItem = $current->getMenuItem();
diff --git a/system/Menu/Page/Iterator/SortableIterator.php b/system/Menu/Page/Iterator/SortableIterator.php
index 56e03891..03079a03 100644
--- a/system/Menu/Page/Iterator/SortableIterator.php
+++ b/system/Menu/Page/Iterator/SortableIterator.php
@@ -39,11 +39,11 @@ public function __construct(\Traversable $iterator, $sort)
$this->iterator = $iterator;
if (self::SORT_BY_NAME === $sort) {
- $this->sort = function ($a, $b) {
+ $this->sort = function (\Herbie\Iterator\SplFileInfo $a, \Herbie\Iterator\SplFileInfo $b) {
return strcmp($a->getRealpath(), $b->getRealpath());
};
} elseif (self::SORT_BY_TYPE === $sort) {
- $this->sort = function ($a, $b) {
+ $this->sort = function (\Herbie\Iterator\SplFileInfo $a, \Herbie\Iterator\SplFileInfo $b) {
if ($a->isDir() && $b->isFile()) {
return -1;
} elseif ($a->isFile() && $b->isDir()) {
@@ -52,15 +52,15 @@ public function __construct(\Traversable $iterator, $sort)
return strcmp($a->getRealpath(), $b->getRealpath());
};
} elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
- $this->sort = function ($a, $b) {
+ $this->sort = function (\Herbie\Iterator\SplFileInfo $a, \Herbie\Iterator\SplFileInfo $b) {
return ($a->getATime() - $b->getATime());
};
} elseif (self::SORT_BY_CHANGED_TIME === $sort) {
- $this->sort = function ($a, $b) {
+ $this->sort = function (\Herbie\Iterator\SplFileInfo $a, \Herbie\Iterator\SplFileInfo $b) {
return ($a->getCTime() - $b->getCTime());
};
} elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
- $this->sort = function ($a, $b) {
+ $this->sort = function (\Herbie\Iterator\SplFileInfo $a, \Herbie\Iterator\SplFileInfo $b) {
return ($a->getMTime() - $b->getMTime());
};
} elseif (is_callable($sort)) {
From 75751cdc855410d5b43b71640d7f23cf98be3167 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 08:59:41 +0100
Subject: [PATCH 05/17] [CHANGE] Removed duplicate code from DataCache and
FilesystemCache to AbstractCache
---
system/Cache/AbstractCache.php | 93 ++++++++++++++++++++++++++++++++
system/Cache/DataCache.php | 78 +--------------------------
system/Cache/FilesystemCache.php | 80 +--------------------------
3 files changed, 96 insertions(+), 155 deletions(-)
create mode 100644 system/Cache/AbstractCache.php
diff --git a/system/Cache/AbstractCache.php b/system/Cache/AbstractCache.php
new file mode 100644
index 00000000..c43876eb
--- /dev/null
+++ b/system/Cache/AbstractCache.php
@@ -0,0 +1,93 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Herbie\Cache;
+
+abstract class AbstractCache implements CacheInterface
+{
+
+ /**
+ * @var boolean
+ */
+ protected $enable;
+
+ /**
+ * @var string
+ */
+ protected $dir;
+
+ /**
+ * @var int
+ */
+ protected $expire;
+
+ /**
+ * @param array $options
+ */
+ public function __construct(array $options = [])
+ {
+ $this->enable = null;
+ $this->dir = null;
+ $this->expire = 60 * 60 * 24;
+ $this->setOptions($options);
+ }
+
+ /**
+ * @param array $options
+ */
+ public function setOptions(array $options)
+ {
+ foreach ($options as $key => $value) {
+ $this->$key = $value;
+ }
+ }
+
+ /**
+ * @param string $id
+ * @return mixed|boolean
+ */
+ public function get($id)
+ {
+ $filename = $this->makeFilename($id);
+ if (file_exists($filename) && (time() - $this->expire < filemtime($filename))) {
+ $serialized = file_get_contents($filename);
+ return unserialize($serialized);
+ }
+ return false;
+ }
+
+ /**
+ * @param string $id
+ * @param mixed $value
+ * @return boolean
+ * @throws \Exception
+ */
+ public function set($id, $value)
+ {
+ $filename = $this->makeFilename($id);
+ $written = file_put_contents($filename, serialize($value));
+ if ($written === false) {
+ throw new \Exception('Could not write to data cache file', 500);
+ }
+ return true;
+ }
+
+ /**
+ * @param string $id
+ * @return string
+ */
+ protected function makeFilename($id)
+ {
+ $id = md5($id);
+ return sprintf('%s/%s.%s', $this->dir, $id, 'cache');
+ }
+
+}
diff --git a/system/Cache/DataCache.php b/system/Cache/DataCache.php
index 3e51e174..b81e3e9a 100644
--- a/system/Cache/DataCache.php
+++ b/system/Cache/DataCache.php
@@ -11,83 +11,7 @@
namespace Herbie\Cache;
-class DataCache implements CacheInterface
+class DataCache extends AbstractCache implements CacheInterface
{
- /**
- * @var boolean
- */
- protected $enable;
-
- /**
- * @var string
- */
- protected $dir;
-
- /**
- * @var int
- */
- protected $expire;
-
- /**
- * @param array $options
- */
- public function __construct(array $options = [])
- {
- $this->enable = null;
- $this->dir = null;
- $this->expire = 60 * 60 * 24;
- $this->setOptions($options);
- }
-
- /**
- * @param array $options
- */
- public function setOptions(array $options)
- {
- foreach ($options as $key => $value) {
- $this->$key = $value;
- }
- }
-
- /**
- * @param string $id
- * @return mixed|boolean
- */
- public function get($id)
- {
- $filename = $this->makeFilename($id);
- if (file_exists($filename) && (time() - $this->expire < filemtime($filename))) {
- $serialized = file_get_contents($filename);
- return unserialize($serialized);
- }
- return false;
- }
-
- /**
- * @param string $id
- * @param mixed $value
- * @return boolean
- * @throws \Exception
- */
- public function set($id, $value)
- {
- $filename = $this->makeFilename($id);
- $written = file_put_contents($filename, serialize($value));
- if ($written === false) {
- throw new \Exception('Could not write to data cache file', 500);
- }
- return true;
- }
-
- /**
- * @param string $id
- * @return string
- */
- protected function makeFilename($id)
- {
- $id = md5($id);
- return sprintf('%s/%s.%s', $this->dir, $id, 'cache');
- }
-
}
diff --git a/system/Cache/FilesystemCache.php b/system/Cache/FilesystemCache.php
index 8f427882..bf158709 100644
--- a/system/Cache/FilesystemCache.php
+++ b/system/Cache/FilesystemCache.php
@@ -11,83 +11,7 @@
namespace Herbie\Cache;
-class FilesystemCache implements CacheInterface
+class FilesystemCache extends AbstractCache implements CacheInterface
{
-
- /**
- * @var boolean
- */
- protected $enable;
-
- /**
- * @var string
- */
- protected $dir;
-
- /**
- * @var int
- */
- protected $expire;
-
- /**
- * @param array $options
- */
- public function __construct(array $options = [])
- {
- $this->enable = null;
- $this->dir = null;
- $this->expire = 60 * 60 * 24;
- $this->setOptions($options);
- }
-
- /**
- * @param array $options
- */
- public function setOptions(array $options)
- {
- foreach ($options as $key => $value) {
- $this->$key = $value;
- }
- }
-
- /**
- * @param string $id
- * @return mixed|boolean
- */
- public function get($id)
- {
- $filename = $this->makeFilename($id);
- if (file_exists($filename) && (time() - $this->expire < filemtime($filename))) {
- $serialized = file_get_contents($filename);
- return unserialize($serialized);
- }
- return false;
- }
-
- /**
- * @param string $id
- * @param mixed $value
- * @return boolean
- * @throws \Exception
- */
- public function set($id, $value)
- {
- $filename = $this->makeFilename($id);
- $written = file_put_contents($filename, serialize($value));
- if ($written === false) {
- throw new \Exception('Could not write to data cache file', 500);
- }
- return true;
- }
-
- /**
- * @param string $id
- * @return string
- */
- protected function makeFilename($id)
- {
- $id = md5($id);
- return sprintf('%s/%s.%s', $this->dir, $id, 'cache');
- }
-
+
}
From eb068cdae6c8e6dd7fb4d19a26acfa66b2784892 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 09:07:30 +0100
Subject: [PATCH 06/17] [CHANGE] Moved duplicate code from
system/Cache/SplFileInfo and system/Iterator/SplFileInfo to
system/SplFileInfo
---
system/Cache/FilesystemCache.php | 2 +-
system/Finder/SplFileInfo.php | 67 +-------------------------
system/Iterator/SplFileInfo.php | 65 +-------------------------
system/SplFileInfo.php | 80 ++++++++++++++++++++++++++++++++
4 files changed, 84 insertions(+), 130 deletions(-)
create mode 100644 system/SplFileInfo.php
diff --git a/system/Cache/FilesystemCache.php b/system/Cache/FilesystemCache.php
index bf158709..0de34063 100644
--- a/system/Cache/FilesystemCache.php
+++ b/system/Cache/FilesystemCache.php
@@ -13,5 +13,5 @@
class FilesystemCache extends AbstractCache implements CacheInterface
{
-
+
}
diff --git a/system/Finder/SplFileInfo.php b/system/Finder/SplFileInfo.php
index b887e635..cf05f775 100644
--- a/system/Finder/SplFileInfo.php
+++ b/system/Finder/SplFileInfo.php
@@ -11,70 +11,7 @@
namespace Herbie\Finder;
-class SplFileInfo extends \SplFileInfo
+class SplFileInfo extends \Herbie\SplFileInfo
{
- private $relativePath;
- private $relativePathname;
-
- /**
- * Constructor
- *
- * @param string $file
- * @param string $relativePath
- * @param string $relativePathname
- */
- public function __construct($file, $relativePath, $relativePathname)
- {
- parent::__construct($file);
- $this->relativePath = $relativePath;
- $this->relativePathname = $relativePathname;
- }
-
- /**
- * Returns the relative path
- *
- * @return string
- */
- public function getRelativePath()
- {
- return $this->relativePath;
- }
-
- /**
- * Returns the relative path name
- *
- * @return string
- */
- public function getRelativePathname()
- {
- return $this->relativePathname;
- }
-
- /**
- * @return bool
- */
- public function isDot()
- {
- return in_array($this->getBasename(), ['.', '..']);
- }
-
- /**
- * Returns the contents of the file
- *
- * @return string
- *
- * @throws \RuntimeException
- */
- public function getContents()
- {
- $level = error_reporting(0);
- $content = file_get_contents($this->getPathname());
- error_reporting($level);
- if (false === $content) {
- $error = error_get_last();
- throw new \RuntimeException($error['message']);
- }
-
- return $content;
- }
+
}
diff --git a/system/Iterator/SplFileInfo.php b/system/Iterator/SplFileInfo.php
index 32feec4f..6dc12a78 100644
--- a/system/Iterator/SplFileInfo.php
+++ b/system/Iterator/SplFileInfo.php
@@ -11,70 +11,7 @@
namespace Herbie\Iterator;
-class SplFileInfo extends \SplFileInfo
+class SplFileInfo extends \Herbie\SplFileInfo
{
- private $relativePath;
- private $relativePathname;
- /**
- * Constructor
- *
- * @param string $file The file name
- * @param string $relativePath The relative path
- * @param string $relativePathname The relative path name
- */
- public function __construct($file, $relativePath, $relativePathname)
- {
- parent::__construct($file);
- $this->relativePath = $relativePath;
- $this->relativePathname = $relativePathname;
- }
-
- /**
- * Returns the relative path
- *
- * @return string the relative path
- */
- public function getRelativePath()
- {
- return $this->relativePath;
- }
-
- /**
- * Returns the relative path name
- *
- * @return string the relative path name
- */
- public function getRelativePathname()
- {
- return $this->relativePathname;
- }
-
- /**
- * @return bool
- */
- public function isDot()
- {
- return in_array($this->getBasename(), ['.', '..']);
- }
-
- /**
- * Returns the contents of the file
- *
- * @return string the contents of the file
- *
- * @throws \RuntimeException
- */
- public function getContents()
- {
- $level = error_reporting(0);
- $content = file_get_contents($this->getPathname());
- error_reporting($level);
- if (false === $content) {
- $error = error_get_last();
- throw new \RuntimeException($error['message']);
- }
-
- return $content;
- }
}
diff --git a/system/SplFileInfo.php b/system/SplFileInfo.php
new file mode 100644
index 00000000..34f5576a
--- /dev/null
+++ b/system/SplFileInfo.php
@@ -0,0 +1,80 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Herbie;
+
+class SplFileInfo extends \SplFileInfo
+{
+ private $relativePath;
+ private $relativePathname;
+
+ /**
+ * Constructor
+ *
+ * @param string $file The file name
+ * @param string $relativePath The relative path
+ * @param string $relativePathname The relative path name
+ */
+ public function __construct($file, $relativePath, $relativePathname)
+ {
+ parent::__construct($file);
+ $this->relativePath = $relativePath;
+ $this->relativePathname = $relativePathname;
+ }
+
+ /**
+ * Returns the relative path
+ *
+ * @return string the relative path
+ */
+ public function getRelativePath()
+ {
+ return $this->relativePath;
+ }
+
+ /**
+ * Returns the relative path name
+ *
+ * @return string the relative path name
+ */
+ public function getRelativePathname()
+ {
+ return $this->relativePathname;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isDot()
+ {
+ return in_array($this->getBasename(), ['.', '..']);
+ }
+
+ /**
+ * Returns the contents of the file
+ *
+ * @return string the contents of the file
+ *
+ * @throws \RuntimeException
+ */
+ public function getContents()
+ {
+ $level = error_reporting(0);
+ $content = file_get_contents($this->getPathname());
+ error_reporting($level);
+ if (false === $content) {
+ $error = error_get_last();
+ throw new \RuntimeException($error['message']);
+ }
+
+ return $content;
+ }
+}
From 44268fb9ae2b642198ef1eb6d0bd5e704c04d1cb Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 11:25:42 +0100
Subject: [PATCH 07/17] [CHANGE] SensioLabsInsight: Usage of a function in
loops should be avoided
---
system/Loader/PageLoader.php | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/system/Loader/PageLoader.php b/system/Loader/PageLoader.php
index 76d4c0a1..c0edb3cc 100644
--- a/system/Loader/PageLoader.php
+++ b/system/Loader/PageLoader.php
@@ -119,7 +119,8 @@ protected function parseContent($content)
}
$segments[] = array_shift($splitted);
- for ($i=0; $i
Date: Fri, 4 Mar 2016 12:01:32 +0100
Subject: [PATCH 08/17] [CHANGE] SensioLabsInsight: Source code should not
contain TODO comments (I changed it at least in master-, but left them in
develop-branch)
---
plugins/twig/classes/Twig.php | 1 -
.../twig/classes/widgets/blog/archives.html | 1 -
.../twig/classes/widgets/blog/categories.html | 2 --
plugins/twig/classes/widgets/blog/tags.html | 2 --
system/Helper/PathHelper.php | 26 +++++++++++++++++++
system/Loader/PageLoader.php | 16 +-----------
system/Menu/Post/Builder.php | 14 +---------
7 files changed, 28 insertions(+), 34 deletions(-)
create mode 100644 system/Helper/PathHelper.php
diff --git a/plugins/twig/classes/Twig.php b/plugins/twig/classes/Twig.php
index fbdb4e9c..eb545565 100644
--- a/plugins/twig/classes/Twig.php
+++ b/plugins/twig/classes/Twig.php
@@ -179,7 +179,6 @@ public function renderString($string)
*/
private function getContext()
{
- // @todo Inject request object or refactor code
return [
'route' => Application::getService('Request')->getRoute(),
'baseUrl' => Application::getService('Request')->getBasePath(),
diff --git a/plugins/twig/classes/widgets/blog/archives.html b/plugins/twig/classes/widgets/blog/archives.html
index 9fcb82ef..434d697e 100644
--- a/plugins/twig/classes/widgets/blog/archives.html
+++ b/plugins/twig/classes/widgets/blog/archives.html
@@ -1,6 +1,5 @@
{% set title = title ? title : 'Archives' %}
{% set showCount = showCount ? showCount : false %}
-{# @todo: option dropdown (Display as dropdown) #}
{% if site.posts.months|length > 0 %}
diff --git a/plugins/twig/classes/widgets/blog/categories.html b/plugins/twig/classes/widgets/blog/categories.html
index c2e8f0f8..6c7bc2ea 100644
--- a/plugins/twig/classes/widgets/blog/categories.html
+++ b/plugins/twig/classes/widgets/blog/categories.html
@@ -1,7 +1,5 @@
{% set title = title ? title : 'Categories' %}
{% set showCount = showCount ? showCount : false %}
-{# @todo: option dropdown (Display as dropdown) #}
-{# @todo: option hierarchical (Show hierarchy) #}
{% if site.posts.categories|length > 0 %}
diff --git a/plugins/twig/classes/widgets/blog/tags.html b/plugins/twig/classes/widgets/blog/tags.html
index e575e2ff..14ce4587 100644
--- a/plugins/twig/classes/widgets/blog/tags.html
+++ b/plugins/twig/classes/widgets/blog/tags.html
@@ -1,7 +1,5 @@
{% set title = title ? title : 'Tags' %}
{% set showCount = showCount ? showCount : false %}
-{# @todo: option dropdown (Display as dropdown) #}
-{# @todo: option hierarchical (Show hierarchy) #}
{% if site.posts.tags|length > 0 %}
diff --git a/system/Helper/PathHelper.php b/system/Helper/PathHelper.php
new file mode 100644
index 00000000..cf80144f
--- /dev/null
+++ b/system/Helper/PathHelper.php
@@ -0,0 +1,26 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Herbie\Helper;
+
+class PathHelper
+{
+ /**
+ * @param string $path
+ * @return string
+ */
+ public static function extractDateFromPath($path)
+ {
+ $filename = basename($path);
+ preg_match('/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/', $filename, $matches);
+ return $matches[1];
+ }
+}
diff --git a/system/Loader/PageLoader.php b/system/Loader/PageLoader.php
index c0edb3cc..de55c422 100644
--- a/system/Loader/PageLoader.php
+++ b/system/Loader/PageLoader.php
@@ -45,7 +45,7 @@ public function load($alias, $addDefFields = true)
$data = (array) Yaml::parse($yaml);
if ($addDefFields) {
$data['format'] = isset($data['format']) ? $data['format'] : pathinfo($alias, PATHINFO_EXTENSION);
- $data['date'] = isset($data['date']) ? $data['date'] : $this->extractDateFromPath($alias);
+ $data['date'] = isset($data['date']) ? $data['date'] : \Herbie\Helper\PathHelper::extractDateFromPath($alias);
$data['path'] = isset($data['path']) ? $data['path'] : $alias;
}
return [
@@ -156,18 +156,4 @@ protected function readFile($alias)
}
return $contents;
}
-
- /**
- * @param string $alias
- * @return string
- * @todo Duplicate code in Herbie\Menu\Post\Builder
- */
- protected function extractDateFromPath($alias)
- {
- $filename = basename($alias);
- if (preg_match('/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/', $filename, $matches)) {
- return $matches[1];
- }
- return null;
- }
}
diff --git a/system/Menu/Post/Builder.php b/system/Menu/Post/Builder.php
index 4902bb22..e509b380 100644
--- a/system/Menu/Post/Builder.php
+++ b/system/Menu/Post/Builder.php
@@ -78,7 +78,7 @@ public function build($path = null)
$data['modified'] = date('c', filemtime($realpath.'/'.$filename));
}
if (empty($data['date'])) {
- $data['date'] = $this->extractDateFromPath($filename);
+ $data['date'] = \Herbie\Helper\PathHelper::extractDateFromPath($filename);
}
$data['path'] = '@post/'.$filename;
$data['blogRoute'] = $this->blogRoute;
@@ -91,16 +91,4 @@ public function build($path = null)
#echo"
";print_r($collection);echo"
";
return $collection;
}
-
- /**
- * @param string $path
- * @return string
- * @todo Duplicate code in Herbie\Loader\PageLoader
- */
- protected function extractDateFromPath($path)
- {
- $filename = basename($path);
- preg_match('/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/', $filename, $matches);
- return $matches[1];
- }
}
From 55cc663924c6f3b0135806bf2ca13bb48b2f3e46 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 12:14:14 +0100
Subject: [PATCH 09/17] [BUGFIX] "Undefined index"-error in PathHelper
---
system/Helper/PathHelper.php | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/system/Helper/PathHelper.php b/system/Helper/PathHelper.php
index cf80144f..9e5c40fa 100644
--- a/system/Helper/PathHelper.php
+++ b/system/Helper/PathHelper.php
@@ -20,7 +20,9 @@ class PathHelper
public static function extractDateFromPath($path)
{
$filename = basename($path);
- preg_match('/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/', $filename, $matches);
- return $matches[1];
+ if(preg_match('/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/', $filename, $matches)) {
+ return $matches[1];
+ }
+ return null;
}
}
From 3996ffef8abb79a31984aeacd5a0660416a11e40 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 12:20:58 +0100
Subject: [PATCH 10/17] [CHANGE] SensioLabsInsight: With booleans, only strict
comparison (with === operator) should be used to lower bug risks and to
improve performances. Changed from 'true' to '1'
---
plugins/shortcode/shortcode.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/shortcode/shortcode.php b/plugins/shortcode/shortcode.php
index d2fbdc73..674f6fdd 100644
--- a/plugins/shortcode/shortcode.php
+++ b/plugins/shortcode/shortcode.php
@@ -164,7 +164,7 @@ protected function addListingTag()
$collection = $collection->sort($field, $direction);
}
- if (true == (int)$options['shuffle']) {
+ if (1 == (int)$options['shuffle']) {
$collection = $collection->shuffle();
}
From 3dedb45b6fdd5c6454bef5c533740fb84aeae38a Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 12:31:02 +0100
Subject: [PATCH 11/17] [CHANGE] Various proposals from SensioLabsInsight
(netzweberei / herbie #3): - Unused method, property, variable or parameter -
Commented code should not be committed
---
plugins/markdown/markdown.php | 3 ---
plugins/shortcode/shortcode.php | 5 -----
plugins/twig/classes/HerbieExtension.php | 5 -----
system/Application.php | 6 +-----
system/Config.php | 3 ---
system/Finder/Finder.php | 4 ----
system/Helper/PageHelper.php | 3 ---
system/Menu/Page/FileFilterCallback.php | 2 +-
system/Menu/Page/Iterator/FilterCallback.php | 2 +-
system/Menu/Post/Builder.php | 1 -
10 files changed, 3 insertions(+), 31 deletions(-)
diff --git a/plugins/markdown/markdown.php b/plugins/markdown/markdown.php
index 7e4d5f47..0f535bf8 100644
--- a/plugins/markdown/markdown.php
+++ b/plugins/markdown/markdown.php
@@ -25,9 +25,6 @@ public static function install()
// add shortcode
if ((bool)$config->get('plugins.config.markdown.shortcode', true)) {
- #Hook::attach('shortcodeInitialized', function($shortcode) {
- # $shortcode->add('markdown', ['MarkdownPlugin', 'markdownShortcode']);
- #});
Hook::attach('shortcodeInitialized', ['MarkdownPlugin', 'addShortcode']);
}
diff --git a/plugins/shortcode/shortcode.php b/plugins/shortcode/shortcode.php
index 674f6fdd..94389c57 100644
--- a/plugins/shortcode/shortcode.php
+++ b/plugins/shortcode/shortcode.php
@@ -360,11 +360,6 @@ protected function addFileTag()
$attributes = $this->extractValuesFromArray(['title', 'text', 'alt', 'class'], $options);
$attributes['alt'] = isset($attributes['alt']) ? $attributes['alt'] : '';
- // Interne Ressource
- if (strpos($options['path'], 'http') !== 0) {
- #$options['path'] = $this->config->get('web.url') . '/' . $options['src'];
- }
-
$info = '';
if (!empty($options['info'])) {
$info = $this->getFileInfo($options['path']);
diff --git a/plugins/twig/classes/HerbieExtension.php b/plugins/twig/classes/HerbieExtension.php
index 36e8371a..9543936c 100644
--- a/plugins/twig/classes/HerbieExtension.php
+++ b/plugins/twig/classes/HerbieExtension.php
@@ -482,7 +482,6 @@ public function functionPagetitle(array $options = [])
$titles[] = $item->title;
}
- #$page = Application::getPage();
if ($this->testIsPost($this->page)) {
$titles[] = $this->page->title;
}
@@ -549,10 +548,6 @@ public function functionPager($limit = '', $template = '{prev}{next}', $linkClas
}
$replacements['{prev}'] = $this->createLink($prev->route, $label, $attribs);
}
- /*if(isset($cur)) {
- $label = empty($curPageLabel) ? $cur->getMenuTitle() : $curPageLabel;
- $replacements['{cur}'] = $this->createLink($cur->route, $label, $attribs);
- }*/
if (isset($next)) {
$label = empty($nextPageLabel) ? $next->getMenuTitle() : $nextPageLabel;
$label = sprintf('%s', $label);
diff --git a/system/Application.php b/system/Application.php
index 1161beff..76f72c5b 100644
--- a/system/Application.php
+++ b/system/Application.php
@@ -156,7 +156,7 @@ private function init()
$route = $DI['Request']->getRoute();
- $page = false; ##$DI['Cache\PageCache']->get($route);
+ $page = false;
if (false === $page) {
@@ -168,10 +168,6 @@ private function init()
$page->load($path);
Hook::trigger(Hook::ACTION, 'pageLoaded', $page);
-
- if (empty($menuItem->nocache)) {
- ##$DI['Cache\PageCache']->set($path, $page);
- }
}
} catch (\Exception $e) {
diff --git a/system/Config.php b/system/Config.php
index 6e386a8a..dae09e8b 100644
--- a/system/Config.php
+++ b/system/Config.php
@@ -57,15 +57,12 @@ public function __construct($sitePath, $webPath, $webUrl)
private function loadConfig($useCache = true)
{
if ($useCache) {
- #$cacheFile = $this->sitePath . '/cache/config.json';
$cacheFile = $this->sitePath . '/cache/config.php';
if (is_file($cacheFile)) {
- #$this->items = json_decode(file_get_contents($cacheFile), true);
$this->items = require($cacheFile);
} else {
$this->loadMainFile();
$this->loadPluginFiles();
- #file_put_contents($cacheFile, json_encode($this->items));
file_put_contents($cacheFile, 'items, true).';');
}
} else {
diff --git a/system/Finder/Finder.php b/system/Finder/Finder.php
index b1c2f2e1..8dade5fc 100644
--- a/system/Finder/Finder.php
+++ b/system/Finder/Finder.php
@@ -117,10 +117,6 @@ public function getIterator()
$iterator = new ExtensionFilterIterator($iterator, $this->extensions);
}
- if ($this->minDepth > -1 || $this->maxDepth < PHP_INT_MAX) {
- #$iterator = new DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
- }
-
return $iterator;
}
diff --git a/system/Helper/PageHelper.php b/system/Helper/PageHelper.php
index 7880e7b1..a1453f3d 100644
--- a/system/Helper/PageHelper.php
+++ b/system/Helper/PageHelper.php
@@ -46,19 +46,16 @@ public static function updateSegments($filepath, array $segments)
if (array_key_exists(0, $segments)) {
$newContent .= PHP_EOL;
$newContent .= $segments[0];
- #$newContent .= PHP_EOL;
unset($segments[0]);
}
if (array_key_exists('', $segments)) {
$newContent .= PHP_EOL;
$newContent .= $segments[''];
- #$newContent .= PHP_EOL;
unset($segments['']);
}
foreach ($segments as $key => $value) {
$newContent .= PHP_EOL . '--- ' . $key . ' ---' . PHP_EOL;
$newContent .= $value;
- #$newContent .= PHP_EOL;
}
return file_put_contents($filepath, $newContent);
diff --git a/system/Menu/Page/FileFilterCallback.php b/system/Menu/Page/FileFilterCallback.php
index 0a5ddc87..7d819627 100644
--- a/system/Menu/Page/FileFilterCallback.php
+++ b/system/Menu/Page/FileFilterCallback.php
@@ -34,7 +34,7 @@ public function __construct($extensions)
* @param \RecursiveDirectoryIterator $iterator
* @return boolean
*/
- public function call(\SplFileInfo $file, $path, \RecursiveDirectoryIterator $iterator)
+ public function call(\SplFileInfo $file)
{
$firstChar = substr($file->getFileName(), 0, 1);
if (in_array($firstChar, ['.', '_'])) {
diff --git a/system/Menu/Page/Iterator/FilterCallback.php b/system/Menu/Page/Iterator/FilterCallback.php
index 893ff8f2..dcdecb1c 100644
--- a/system/Menu/Page/Iterator/FilterCallback.php
+++ b/system/Menu/Page/Iterator/FilterCallback.php
@@ -24,7 +24,7 @@ public function __construct(array $routeLine)
$this->routeLine = $routeLine;
}
- public function call(\Herbie\Menu\Page\Node $current, $key, $iterator)
+ public function call(\Herbie\Menu\Page\Node $current)
{
$menuItem = $current->getMenuItem();
diff --git a/system/Menu/Post/Builder.php b/system/Menu/Post/Builder.php
index e509b380..fe4c1ae6 100644
--- a/system/Menu/Post/Builder.php
+++ b/system/Menu/Post/Builder.php
@@ -88,7 +88,6 @@ public function build($path = null)
}
$this->cache->set(__CLASS__, $collection);
}
- #echo"
";print_r($collection);echo"
";
return $collection;
}
}
From 74317dd3f82c49300ef0651f83cf08fbc2794879 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 13:06:07 +0100
Subject: [PATCH 12/17] [CHANGE] SensioLabsInsight (netzweberei / herbie #3):
Text files should end with a newline character
---
.gitignore | 2 +-
README.md | 2 +-
log/.gitignore | 2 +-
plugins/markdown/composer.json | 2 +-
plugins/textile/composer.json | 2 +-
plugins/twig/classes/widgets/listing.twig | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/.gitignore b/.gitignore
index da9562f3..b294f429 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,4 +25,4 @@ cache/twig/
/apps
# Tests
-/src/Tests
\ No newline at end of file
+/src/Tests
diff --git a/README.md b/README.md
index 7dd9699a..4aa72b63 100644
--- a/README.md
+++ b/README.md
@@ -42,4 +42,4 @@ Weitere Informationen findest du unter [www.getherbie.org](http://www.getherbie.
[packagist]: https://packagist.org
[symfony]: http://symfony.com/doc/current/components/
[phpunit]: http://phpunit.de
-[imagine]: https://github.com/avalanche123/Imagine
\ No newline at end of file
+[imagine]: https://github.com/avalanche123/Imagine
diff --git a/log/.gitignore b/log/.gitignore
index 86d0cb27..5e7d2734 100644
--- a/log/.gitignore
+++ b/log/.gitignore
@@ -1,4 +1,4 @@
# Ignore everything in this directory
*
# Except this file
-!.gitignore
\ No newline at end of file
+!.gitignore
diff --git a/plugins/markdown/composer.json b/plugins/markdown/composer.json
index bdacc0cd..89894905 100644
--- a/plugins/markdown/composer.json
+++ b/plugins/markdown/composer.json
@@ -5,4 +5,4 @@
"keywords": ["herbie", "plugin", "markdown"],
"type": "herbie-plugin",
"license": "BSD-3-Clause"
-}
\ No newline at end of file
+}
diff --git a/plugins/textile/composer.json b/plugins/textile/composer.json
index 2e19afd6..5be35f86 100644
--- a/plugins/textile/composer.json
+++ b/plugins/textile/composer.json
@@ -5,4 +5,4 @@
"keywords": ["herbie", "plugin", "textile"],
"type": "herbie-plugin",
"license": "BSD-3-Clause"
-}
\ No newline at end of file
+}
diff --git a/plugins/twig/classes/widgets/listing.twig b/plugins/twig/classes/widgets/listing.twig
index 2bf07060..9a579cd0 100644
--- a/plugins/twig/classes/widgets/listing.twig
+++ b/plugins/twig/classes/widgets/listing.twig
@@ -22,4 +22,4 @@
Nächste Seite
{% endif %}
-
\ No newline at end of file
+
From 05555a459ba9160ff84d50ab411952893e1e0676 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 17:30:43 +0100
Subject: [PATCH 13/17] [CHANGE] SensioLabsInsight: Don't silence errors by the
at sign (@) Adding "@" before list($name, $callable, $options) = $function
prevents warning and errors during this function execution from being
displayed. If you need to do that, you should probably implement a better way
to qualify and recover from errors, using Exceptions.
---
plugins/twig/classes/Twig.php | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/plugins/twig/classes/Twig.php b/plugins/twig/classes/Twig.php
index eb545565..de4eb71b 100644
--- a/plugins/twig/classes/Twig.php
+++ b/plugins/twig/classes/Twig.php
@@ -64,18 +64,24 @@ public function init()
$this->addTwigPlugins();
foreach(Hook::trigger(Hook::CONFIG, 'addTwigFunction') as $function) {
- @list($name, $callable, $options) = $function;
- $this->environment->addFunction(new \Twig_SimpleFunction($name, $callable, (array)$options));
+ try {
+ list($name, $callable, $options) = $function;
+ $this->environment->addFunction(new \Twig_SimpleFunction($name, $callable, (array)$options));
+ } catch (\Exception $e) {;/*do nothing else yet*/}
}
foreach(Hook::trigger(Hook::CONFIG, 'addTwigFilter') as $filter) {
- @list($name, $callable, $options) = $filter;
- $this->environment->addFilter(new \Twig_SimpleFilter($name, $callable, (array)$options));
+ try {
+ list($name, $callable, $options) = $filter;
+ $this->environment->addFilter(new \Twig_SimpleFilter($name, $callable, (array)$options));
+ } catch (\Exception $e) {;/*do nothing else yet*/}
}
foreach(Hook::trigger(Hook::CONFIG, 'addTwigTest') as $test) {
- @list($name, $callable, $options) = $test;
- $this->environment->addTest(new \Twig_SimpleTest($name, $callable, (array)$options));
+ try {
+ list($name, $callable, $options) = $test;
+ $this->environment->addTest(new \Twig_SimpleTest($name, $callable, (array)$options));
+ } catch (\Exception $e) {;/*do nothing else yet*/}
}
$this->initialized = true;
From bfa2bdf369a17b620ee27a4bdf189613f6bc72a8 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 17:36:07 +0100
Subject: [PATCH 14/17] [CHANGE] User specific files should not appear in
.gitignore - moved 'nbproject' and '.DS_Store' to global ignore-file
---
.gitignore | 6 ------
1 file changed, 6 deletions(-)
diff --git a/.gitignore b/.gitignore
index da9562f3..1a62abe6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,3 @@
-# netbeans project files
-nbproject
-
# apigen docs dir
/docs
@@ -13,9 +10,6 @@ composer.phar
# composer lock files
composer.lock
-# mac DS_Store files
-.DS_Store
-
# cache folders
cache/data/
cache/page/
From 79fa92c44b458e59bf34a29d64d5f5a32b7f2ee2 Mon Sep 17 00:00:00 2001
From: Andreas Neumann
Date: Fri, 4 Mar 2016 17:57:58 +0100
Subject: [PATCH 15/17] [FEATURE] SensioLabsInsight: Remove unused code ->
Didn't remove unused properties 'minDepth' and 'maxDepth', but used them in
the getIterator()-method (i.e. uncommented line #121)
---
system/Finder/Finder.php | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/system/Finder/Finder.php b/system/Finder/Finder.php
index 8dade5fc..35eca1ef 100644
--- a/system/Finder/Finder.php
+++ b/system/Finder/Finder.php
@@ -117,6 +117,10 @@ public function getIterator()
$iterator = new ExtensionFilterIterator($iterator, $this->extensions);
}
+ if ($this->minDepth > -1 || $this->maxDepth < PHP_INT_MAX) {
+ $iterator = new DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
+ }
+
return $iterator;
}
From a25f2990db4d0eb9b6f27338d8174e3d1635084d Mon Sep 17 00:00:00 2001
From: Thomas Breuss
Date: Tue, 8 Mar 2016 18:53:42 +0100
Subject: [PATCH 16/17] Delete twig doc & test folders
---
.../twig/vendor/twig/twig/doc/advanced.rst | 872 -----------------
.../vendor/twig/twig/doc/advanced_legacy.rst | 887 -----------------
plugins/twig/vendor/twig/twig/doc/api.rst | 552 -----------
.../vendor/twig/twig/doc/coding_standards.rst | 101 --
.../twig/vendor/twig/twig/doc/deprecated.rst | 162 ----
.../twig/vendor/twig/twig/doc/filters/abs.rst | 18 -
.../vendor/twig/twig/doc/filters/batch.rst | 51 -
.../twig/twig/doc/filters/capitalize.rst | 11 -
.../twig/doc/filters/convert_encoding.rst | 28 -
.../vendor/twig/twig/doc/filters/date.rst | 94 --
.../twig/twig/doc/filters/date_modify.rst | 23 -
.../vendor/twig/twig/doc/filters/default.rst | 33 -
.../vendor/twig/twig/doc/filters/escape.rst | 116 ---
.../vendor/twig/twig/doc/filters/first.rst | 25 -
.../vendor/twig/twig/doc/filters/format.rst | 16 -
.../vendor/twig/twig/doc/filters/index.rst | 37 -
.../vendor/twig/twig/doc/filters/join.rst | 23 -
.../twig/twig/doc/filters/json_encode.rst | 21 -
.../vendor/twig/twig/doc/filters/keys.rst | 11 -
.../vendor/twig/twig/doc/filters/last.rst | 25 -
.../vendor/twig/twig/doc/filters/length.rst | 11 -
.../vendor/twig/twig/doc/filters/lower.rst | 10 -
.../vendor/twig/twig/doc/filters/merge.rst | 48 -
.../vendor/twig/twig/doc/filters/nl2br.rst | 22 -
.../twig/twig/doc/filters/number_format.rst | 45 -
.../twig/vendor/twig/twig/doc/filters/raw.rst | 36 -
.../vendor/twig/twig/doc/filters/replace.rst | 19 -
.../vendor/twig/twig/doc/filters/reverse.rst | 47 -
.../vendor/twig/twig/doc/filters/round.rst | 37 -
.../vendor/twig/twig/doc/filters/slice.rst | 71 --
.../vendor/twig/twig/doc/filters/sort.rst | 18 -
.../vendor/twig/twig/doc/filters/split.rst | 53 -
.../twig/twig/doc/filters/striptags.rst | 15 -
.../vendor/twig/twig/doc/filters/title.rst | 11 -
.../vendor/twig/twig/doc/filters/trim.rst | 29 -
.../vendor/twig/twig/doc/filters/upper.rst | 10 -
.../twig/twig/doc/filters/url_encode.rst | 34 -
.../twig/twig/doc/functions/attribute.rst | 26 -
.../vendor/twig/twig/doc/functions/block.rst | 15 -
.../twig/twig/doc/functions/constant.rst | 18 -
.../vendor/twig/twig/doc/functions/cycle.rst | 28 -
.../vendor/twig/twig/doc/functions/date.rst | 52 -
.../vendor/twig/twig/doc/functions/dump.rst | 69 --
.../twig/twig/doc/functions/include.rst | 80 --
.../vendor/twig/twig/doc/functions/index.rst | 20 -
.../vendor/twig/twig/doc/functions/max.rst | 20 -
.../vendor/twig/twig/doc/functions/min.rst | 20 -
.../vendor/twig/twig/doc/functions/parent.rst | 20 -
.../vendor/twig/twig/doc/functions/random.rst | 29 -
.../vendor/twig/twig/doc/functions/range.rst | 45 -
.../vendor/twig/twig/doc/functions/source.rst | 32 -
.../doc/functions/template_from_string.rst | 32 -
plugins/twig/vendor/twig/twig/doc/index.rst | 19 -
.../vendor/twig/twig/doc/installation.rst | 116 ---
.../twig/vendor/twig/twig/doc/internals.rst | 138 ---
plugins/twig/vendor/twig/twig/doc/intro.rst | 85 --
plugins/twig/vendor/twig/twig/doc/recipes.rst | 518 ----------
.../vendor/twig/twig/doc/tags/autoescape.rst | 83 --
.../twig/vendor/twig/twig/doc/tags/block.rst | 11 -
plugins/twig/vendor/twig/twig/doc/tags/do.rst | 12 -
.../twig/vendor/twig/twig/doc/tags/embed.rst | 178 ----
.../vendor/twig/twig/doc/tags/extends.rst | 268 ------
.../twig/vendor/twig/twig/doc/tags/filter.rst | 21 -
.../twig/vendor/twig/twig/doc/tags/flush.rst | 17 -
.../twig/vendor/twig/twig/doc/tags/for.rst | 172 ----
.../twig/vendor/twig/twig/doc/tags/from.rst | 8 -
plugins/twig/vendor/twig/twig/doc/tags/if.rst | 76 --
.../twig/vendor/twig/twig/doc/tags/import.rst | 57 --
.../vendor/twig/twig/doc/tags/include.rst | 86 --
.../twig/vendor/twig/twig/doc/tags/index.rst | 24 -
.../twig/vendor/twig/twig/doc/tags/macro.rst | 86 --
.../vendor/twig/twig/doc/tags/sandbox.rst | 30 -
.../twig/vendor/twig/twig/doc/tags/set.rst | 78 --
.../vendor/twig/twig/doc/tags/spaceless.rst | 37 -
.../twig/vendor/twig/twig/doc/tags/use.rst | 124 ---
.../vendor/twig/twig/doc/tags/verbatim.rst | 24 -
.../twig/vendor/twig/twig/doc/templates.rst | 907 ------------------
.../vendor/twig/twig/doc/tests/constant.rst | 22 -
.../vendor/twig/twig/doc/tests/defined.rst | 30 -
.../twig/twig/doc/tests/divisibleby.rst | 14 -
.../twig/vendor/twig/twig/doc/tests/empty.rst | 11 -
.../twig/vendor/twig/twig/doc/tests/even.rst | 10 -
.../twig/vendor/twig/twig/doc/tests/index.rst | 15 -
.../vendor/twig/twig/doc/tests/iterable.rst | 19 -
.../twig/vendor/twig/twig/doc/tests/null.rst | 12 -
.../twig/vendor/twig/twig/doc/tests/odd.rst | 10 -
.../vendor/twig/twig/doc/tests/sameas.rst | 14 -
.../twig/test/Twig/Tests/AutoloaderTest.php | 24 -
.../test/Twig/Tests/Cache/FilesystemTest.php | 193 ----
.../twig/test/Twig/Tests/CompilerTest.php | 33 -
.../twig/test/Twig/Tests/EnvironmentTest.php | 529 ----------
.../twig/twig/test/Twig/Tests/ErrorTest.php | 144 ---
.../test/Twig/Tests/ExpressionParserTest.php | 368 -------
.../test/Twig/Tests/Extension/CoreTest.php | 158 ---
.../test/Twig/Tests/Extension/SandboxTest.php | 220 -----
.../twig/test/Twig/Tests/FileCachingTest.php | 63 --
.../FileExtensionEscapingStrategyTest.php | 51 -
.../twig/test/Twig/Tests/FilesystemHelper.php | 30 -
.../Tests/Fixtures/autoescape/filename.test | 18 -
.../test/Twig/Tests/Fixtures/errors/base.html | 1 -
.../Twig/Tests/Fixtures/errors/index.html | 7 -
...ltiline_array_with_undefined_variable.test | 18 -
...e_array_with_undefined_variable_again.test | 18 -
...line_function_with_undefined_variable.test | 12 -
...tiline_function_with_unknown_argument.test | 9 -
...multiline_tag_with_undefined_variable.test | 12 -
.../syntax_error_in_reused_template.test | 10 -
.../Fixtures/exceptions/unclosed_tag.test | 20 -
.../Fixtures/exceptions/undefined_parent.test | 8 -
.../undefined_template_in_child_template.test | 15 -
.../Fixtures/exceptions/undefined_trait.test | 9 -
.../Tests/Fixtures/expressions/array.test | 61 --
.../Fixtures/expressions/array_call.test | 14 -
.../Tests/Fixtures/expressions/binary.test | 46 -
.../Tests/Fixtures/expressions/bitwise.test | 14 -
.../Fixtures/expressions/comparison.test | 14 -
.../Fixtures/expressions/divisibleby.test | 17 -
.../Tests/Fixtures/expressions/dotdot.test | 20 -
.../Tests/Fixtures/expressions/ends_with.test | 26 -
.../Tests/Fixtures/expressions/grouping.test | 8 -
.../Tests/Fixtures/expressions/literals.test | 22 -
.../Fixtures/expressions/magic_call.test | 27 -
.../Tests/Fixtures/expressions/matches.test | 12 -
.../Fixtures/expressions/method_call.test | 28 -
.../expressions/negative_numbers.test | 18 -
.../expressions/operators_as_variables.test | 16 -
.../Tests/Fixtures/expressions/postfix.test | 22 -
.../Tests/Fixtures/expressions/sameas.test | 21 -
.../Fixtures/expressions/starts_with.test | 27 -
.../Tests/Fixtures/expressions/strings.test | 10 -
.../expressions/ternary_operator.test | 18 -
.../expressions/ternary_operator_noelse.test | 10 -
.../expressions/ternary_operator_nothen.test | 10 -
.../two_word_operators_as_variables.test | 8 -
.../Tests/Fixtures/expressions/unary.test | 12 -
.../expressions/unary_macro_arguments.test | 22 -
.../expressions/unary_precedence.test | 14 -
.../test/Twig/Tests/Fixtures/filters/abs.test | 30 -
.../Twig/Tests/Fixtures/filters/batch.test | 31 -
.../Tests/Fixtures/filters/batch_float.test | 29 -
.../filters/batch_with_empty_fill.test | 37 -
.../filters/batch_with_exact_elements.test | 33 -
.../Fixtures/filters/batch_with_fill.test | 37 -
.../Fixtures/filters/batch_with_keys.test | 10 -
.../filters/batch_with_zero_elements.test | 10 -
.../Fixtures/filters/convert_encoding.test | 10 -
.../Twig/Tests/Fixtures/filters/date.test | 90 --
.../Fixtures/filters/date_default_format.test | 14 -
.../filters/date_default_format_interval.test | 16 -
.../Fixtures/filters/date_immutable.test | 37 -
.../Tests/Fixtures/filters/date_interval.test | 19 -
.../Tests/Fixtures/filters/date_modify.test | 14 -
.../Fixtures/filters/date_namedargs.test | 13 -
.../Twig/Tests/Fixtures/filters/default.test | 150 ---
.../Fixtures/filters/dynamic_filter.test | 10 -
.../Twig/Tests/Fixtures/filters/escape.test | 8 -
.../Fixtures/filters/escape_html_attr.test | 8 -
.../filters/escape_non_supported_charset.test | 8 -
.../Twig/Tests/Fixtures/filters/first.test | 17 -
.../Tests/Fixtures/filters/force_escape.test | 18 -
.../Twig/Tests/Fixtures/filters/format.test | 8 -
.../Twig/Tests/Fixtures/filters/join.test | 12 -
.../Tests/Fixtures/filters/json_encode.test | 12 -
.../Twig/Tests/Fixtures/filters/last.test | 17 -
.../Twig/Tests/Fixtures/filters/length.test | 14 -
.../Tests/Fixtures/filters/length_utf8.test | 12 -
.../Twig/Tests/Fixtures/filters/merge.test | 18 -
.../Twig/Tests/Fixtures/filters/nl2br.test | 14 -
.../Tests/Fixtures/filters/number_format.test | 18 -
.../filters/number_format_default.test | 21 -
.../Twig/Tests/Fixtures/filters/replace.test | 12 -
.../Fixtures/filters/replace_invalid_arg.test | 8 -
.../Twig/Tests/Fixtures/filters/reverse.test | 18 -
.../Twig/Tests/Fixtures/filters/round.test | 22 -
.../Twig/Tests/Fixtures/filters/slice.test | 54 --
.../Twig/Tests/Fixtures/filters/sort.test | 12 -
.../Tests/Fixtures/filters/special_chars.test | 8 -
.../Twig/Tests/Fixtures/filters/split.test | 20 -
.../Tests/Fixtures/filters/split_utf8.test | 24 -
.../Twig/Tests/Fixtures/filters/trim.test | 12 -
.../Tests/Fixtures/filters/urlencode.test | 16 -
.../filters/urlencode_deprecated.test | 16 -
.../Tests/Fixtures/functions/attribute.test | 18 -
.../Twig/Tests/Fixtures/functions/block.test | 12 -
.../Tests/Fixtures/functions/constant.test | 10 -
.../Twig/Tests/Fixtures/functions/cycle.test | 16 -
.../Twig/Tests/Fixtures/functions/date.test | 25 -
.../Fixtures/functions/date_namedargs.test | 11 -
.../Twig/Tests/Fixtures/functions/dump.test | 16 -
.../Tests/Fixtures/functions/dump_array.test | 19 -
.../Fixtures/functions/dynamic_function.test | 10 -
.../functions/include/assignment.test | 13 -
.../functions/include/autoescaping.test | 10 -
.../Fixtures/functions/include/basic.test | 17 -
.../functions/include/expression.test | 17 -
.../functions/include/ignore_missing.test | 10 -
.../Fixtures/functions/include/missing.test | 8 -
.../functions/include/missing_nested.test | 16 -
.../Fixtures/functions/include/sandbox.test | 13 -
.../functions/include/sandbox_disabling.test | 16 -
.../sandbox_disabling_ignore_missing.test | 13 -
.../functions/include/template_instance.test | 10 -
.../functions/include/templates_as_array.test | 12 -
.../functions/include/with_context.test | 16 -
.../functions/include/with_variables.test | 12 -
.../Twig/Tests/Fixtures/functions/max.test | 12 -
.../Twig/Tests/Fixtures/functions/min.test | 12 -
.../Twig/Tests/Fixtures/functions/range.test | 8 -
.../recursive_block_with_inheritance.test | 21 -
.../Twig/Tests/Fixtures/functions/source.test | 17 -
.../Fixtures/functions/special_chars.test | 8 -
.../functions/template_from_string.test | 15 -
.../Tests/Fixtures/macros/default_values.test | 16 -
.../Tests/Fixtures/macros/nested_calls.test | 18 -
.../Fixtures/macros/reserved_variables.test | 14 -
.../Twig/Tests/Fixtures/macros/simple.test | 22 -
.../Twig/Tests/Fixtures/macros/varargs.test | 21 -
.../Fixtures/macros/varargs_argument.test | 8 -
.../Tests/Fixtures/macros/with_filters.test | 14 -
.../regression/combined_debug_info.test | 15 -
.../Fixtures/regression/empty_token.test | 8 -
.../Tests/Fixtures/regression/issue_1143.test | 23 -
.../Fixtures/regression/multi_word_tests.test | 10 -
.../regression/simple_xml_element.test | 19 -
.../regression/strings_like_numbers.test | 8 -
.../Tests/Fixtures/tags/autoescape/basic.test | 26 -
.../Fixtures/tags/autoescape/blocks.test | 12 -
.../tags/autoescape/double_escaping.test | 10 -
.../Fixtures/tags/autoescape/functions.test | 83 --
.../Fixtures/tags/autoescape/literal.test | 45 -
.../Fixtures/tags/autoescape/nested.test | 26 -
.../Fixtures/tags/autoescape/objects.test | 26 -
.../Tests/Fixtures/tags/autoescape/raw.test | 10 -
.../tags/autoescape/strategy.legacy.test | 11 -
.../Fixtures/tags/autoescape/strategy.test | 11 -
.../Tests/Fixtures/tags/autoescape/type.test | 69 --
.../tags/autoescape/with_filters.test | 131 ---
.../autoescape/with_filters_arguments.test | 23 -
.../autoescape/with_pre_escape_filters.test | 68 --
.../with_preserves_safety_filters.test | 50 -
.../Twig/Tests/Fixtures/tags/block/basic.test | 11 -
.../tags/block/block_unique_name.test | 11 -
.../Fixtures/tags/block/special_chars.test | 10 -
.../Twig/Tests/Fixtures/tags/embed/basic.test | 35 -
.../Tests/Fixtures/tags/embed/error_line.test | 16 -
.../Tests/Fixtures/tags/embed/multiple.test | 50 -
.../Tests/Fixtures/tags/embed/nested.test | 42 -
.../Fixtures/tags/embed/with_extends.test | 60 --
.../Tests/Fixtures/tags/filter/basic.test | 10 -
.../Fixtures/tags/filter/json_encode.test | 8 -
.../Tests/Fixtures/tags/filter/multiple.test | 10 -
.../Tests/Fixtures/tags/filter/nested.test | 16 -
.../Fixtures/tags/filter/with_for_tag.test | 13 -
.../Fixtures/tags/filter/with_if_tag.test | 29 -
.../Tests/Fixtures/tags/for/condition.test | 14 -
.../Twig/Tests/Fixtures/tags/for/context.test | 18 -
.../Twig/Tests/Fixtures/tags/for/else.test | 23 -
.../Fixtures/tags/for/inner_variables.test | 17 -
.../Twig/Tests/Fixtures/tags/for/keys.test | 11 -
.../Fixtures/tags/for/keys_and_values.test | 11 -
.../Tests/Fixtures/tags/for/loop_context.test | 19 -
.../Fixtures/tags/for/loop_context_local.test | 10 -
.../Fixtures/tags/for/loop_not_defined.test | 10 -
.../tags/for/loop_not_defined_cond.test | 9 -
.../Tests/Fixtures/tags/for/nested_else.test | 17 -
.../Twig/Tests/Fixtures/tags/for/objects.test | 43 -
.../Fixtures/tags/for/objects_countable.test | 47 -
.../Tests/Fixtures/tags/for/recursive.test | 18 -
.../Twig/Tests/Fixtures/tags/for/values.test | 11 -
.../test/Twig/Tests/Fixtures/tags/from.test | 14 -
.../Twig/Tests/Fixtures/tags/if/basic.test | 22 -
.../Tests/Fixtures/tags/if/expression.test | 22 -
.../Tests/Fixtures/tags/include/basic.test | 16 -
.../Fixtures/tags/include/expression.test | 16 -
.../Fixtures/tags/include/ignore_missing.test | 10 -
.../Tests/Fixtures/tags/include/missing.test | 8 -
.../Fixtures/tags/include/missing_nested.test | 16 -
.../Tests/Fixtures/tags/include/only.test | 16 -
.../tags/include/template_instance.test | 10 -
.../tags/include/templates_as_array.test | 12 -
.../Fixtures/tags/include/with_variables.test | 12 -
.../Fixtures/tags/inheritance/basic.test | 14 -
.../Fixtures/tags/inheritance/block_expr.test | 32 -
.../tags/inheritance/block_expr2.test | 34 -
.../tags/inheritance/conditional.test | 14 -
.../Fixtures/tags/inheritance/dynamic.test | 14 -
.../Fixtures/tags/inheritance/empty.test | 10 -
.../tags/inheritance/extends_as_array.test | 12 -
.../extends_as_array_with_empty_name.test | 12 -
.../extends_as_array_with_null_name.test | 12 -
.../Fixtures/tags/inheritance/multiple.test | 12 -
.../tags/inheritance/multiple_dynamic.test | 22 -
.../tags/inheritance/nested_blocks.test | 22 -
.../nested_blocks_parent_only.test | 15 -
.../tags/inheritance/nested_inheritance.test | 16 -
.../Fixtures/tags/inheritance/parent.test | 12 -
.../tags/inheritance/parent_change.test | 16 -
.../tags/inheritance/parent_in_a_block.test | 8 -
.../tags/inheritance/parent_isolation.test | 20 -
.../tags/inheritance/parent_nested.test | 28 -
.../inheritance/parent_without_extends.test | 8 -
.../parent_without_extends_but_traits.test | 14 -
.../tags/inheritance/template_instance.test | 14 -
.../Tests/Fixtures/tags/inheritance/use.test | 44 -
.../Twig/Tests/Fixtures/tags/macro/basic.test | 17 -
.../Fixtures/tags/macro/endmacro_name.test | 16 -
.../Tests/Fixtures/tags/macro/external.test | 17 -
.../Twig/Tests/Fixtures/tags/macro/from.test | 18 -
.../tags/macro/from_with_reserved_name.test | 9 -
.../Tests/Fixtures/tags/macro/global.test | 14 -
.../tags/macro/import_with_reserved_nam.test | 11 -
.../Fixtures/tags/macro/reserved_name.test | 10 -
.../Fixtures/tags/macro/self_import.test | 17 -
.../Fixtures/tags/macro/special_chars.test | 14 -
.../Fixtures/tags/macro/super_globals.test | 14 -
.../Tests/Fixtures/tags/raw/basic.legacy.test | 10 -
.../tags/raw/mixed_usage_with_raw.legacy.test | 10 -
.../tags/raw/whitespace_control.legacy.test | 56 --
.../Fixtures/tags/sandbox/not_valid1.test | 11 -
.../Fixtures/tags/sandbox/not_valid2.test | 14 -
.../Tests/Fixtures/tags/sandbox/simple.test | 22 -
.../Twig/Tests/Fixtures/tags/set/basic.test | 20 -
.../Fixtures/tags/set/capture-empty.test | 9 -
.../Twig/Tests/Fixtures/tags/set/capture.test | 10 -
.../Tests/Fixtures/tags/set/expression.test | 12 -
.../Tests/Fixtures/tags/spaceless/simple.test | 12 -
.../Tests/Fixtures/tags/special_chars.test | 8 -
.../Twig/Tests/Fixtures/tags/trim_block.test | 74 --
.../Twig/Tests/Fixtures/tags/use/aliases.test | 12 -
.../Twig/Tests/Fixtures/tags/use/basic.test | 12 -
.../Twig/Tests/Fixtures/tags/use/deep.test | 22 -
.../Tests/Fixtures/tags/use/deep_empty.test | 10 -
.../Tests/Fixtures/tags/use/inheritance.test | 25 -
.../Tests/Fixtures/tags/use/inheritance2.test | 24 -
.../Tests/Fixtures/tags/use/multiple.test | 21 -
.../Fixtures/tags/use/multiple_aliases.test | 23 -
.../Tests/Fixtures/tags/use/parent_block.test | 24 -
.../Fixtures/tags/use/parent_block2.test | 24 -
.../Fixtures/tags/use/parent_block3.test | 38 -
.../Tests/Fixtures/tags/verbatim/basic.test | 10 -
.../tags/verbatim/mixed_usage_with_raw.test | 10 -
.../tags/verbatim/whitespace_control.test | 56 --
.../test/Twig/Tests/Fixtures/tests/array.test | 24 -
.../Twig/Tests/Fixtures/tests/constant.test | 14 -
.../Twig/Tests/Fixtures/tests/defined.test | 129 ---
.../test/Twig/Tests/Fixtures/tests/empty.test | 45 -
.../test/Twig/Tests/Fixtures/tests/even.test | 14 -
.../test/Twig/Tests/Fixtures/tests/in.test | 128 ---
.../Tests/Fixtures/tests/in_with_objects.test | 19 -
.../Twig/Tests/Fixtures/tests/iterable.test | 19 -
.../Tests/Fixtures/tests/null_coalesce.test | 30 -
.../test/Twig/Tests/Fixtures/tests/odd.test | 10 -
.../twig/test/Twig/Tests/IntegrationTest.php | 229 -----
.../Tests/LegacyFixtures/test.legacy.test | 8 -
.../test/Twig/Tests/LegacyIntegrationTest.php | 54 --
.../twig/twig/test/Twig/Tests/LexerTest.php | 300 ------
.../twig/test/Twig/Tests/Loader/ArrayTest.php | 97 --
.../twig/test/Twig/Tests/Loader/ChainTest.php | 79 --
.../test/Twig/Tests/Loader/FilesystemTest.php | 175 ----
.../array_inheritance_empty_parent.html.twig | 3 -
...y_inheritance_nonexistent_parent.html.twig | 3 -
.../array_inheritance_null_parent.html.twig | 3 -
.../array_inheritance_valid_parent.html.twig | 3 -
.../Fixtures/inheritance/parent.html.twig | 1 -
.../inheritance/spare_parent.html.twig | 1 -
.../Tests/Loader/Fixtures/named/index.html | 1 -
.../Loader/Fixtures/named_bis/index.html | 1 -
.../Loader/Fixtures/named_final/index.html | 1 -
.../Fixtures/named_quater/named_absolute.html | 1 -
.../Loader/Fixtures/named_ter/index.html | 1 -
.../Tests/Loader/Fixtures/normal/index.html | 1 -
.../Loader/Fixtures/normal_bis/index.html | 1 -
.../Loader/Fixtures/normal_final/index.html | 1 -
.../Loader/Fixtures/normal_ter/index.html | 1 -
.../Fixtures/themes/theme1/blocks.html.twig | 3 -
.../Fixtures/themes/theme2/blocks.html.twig | 3 -
.../test/Twig/Tests/NativeExtensionTest.php | 33 -
.../test/Twig/Tests/Node/AutoEscapeTest.php | 32 -
.../Twig/Tests/Node/BlockReferenceTest.php | 31 -
.../twig/test/Twig/Tests/Node/BlockTest.php | 39 -
.../twig/twig/test/Twig/Tests/Node/DoTest.php | 32 -
.../Twig/Tests/Node/Expression/ArrayTest.php | 37 -
.../Tests/Node/Expression/AssignNameTest.php | 29 -
.../Tests/Node/Expression/Binary/AddTest.php | 34 -
.../Tests/Node/Expression/Binary/AndTest.php | 34 -
.../Node/Expression/Binary/ConcatTest.php | 34 -
.../Tests/Node/Expression/Binary/DivTest.php | 34 -
.../Node/Expression/Binary/FloorDivTest.php | 34 -
.../Tests/Node/Expression/Binary/ModTest.php | 34 -
.../Tests/Node/Expression/Binary/MulTest.php | 34 -
.../Tests/Node/Expression/Binary/OrTest.php | 34 -
.../Tests/Node/Expression/Binary/SubTest.php | 34 -
.../Twig/Tests/Node/Expression/CallTest.php | 116 ---
.../Tests/Node/Expression/ConditionalTest.php | 38 -
.../Tests/Node/Expression/ConstantTest.php | 30 -
.../Twig/Tests/Node/Expression/FilterTest.php | 154 ---
.../Tests/Node/Expression/FunctionTest.php | 110 ---
.../Tests/Node/Expression/GetAttrTest.php | 50 -
.../Twig/Tests/Node/Expression/NameTest.php | 35 -
.../Node/Expression/PHP53/FilterInclude.php | 6 -
.../Node/Expression/PHP53/FunctionInclude.php | 6 -
.../Node/Expression/PHP53/TestInclude.php | 6 -
.../Twig/Tests/Node/Expression/ParentTest.php | 28 -
.../Twig/Tests/Node/Expression/TestTest.php | 82 --
.../Tests/Node/Expression/Unary/NegTest.php | 32 -
.../Tests/Node/Expression/Unary/NotTest.php | 31 -
.../Tests/Node/Expression/Unary/PosTest.php | 31 -
.../twig/test/Twig/Tests/Node/ForTest.php | 191 ----
.../twig/twig/test/Twig/Tests/Node/IfTest.php | 88 --
.../twig/test/Twig/Tests/Node/ImportTest.php | 40 -
.../twig/test/Twig/Tests/Node/IncludeTest.php | 83 --
.../twig/test/Twig/Tests/Node/MacroTest.php | 70 --
.../twig/test/Twig/Tests/Node/ModuleTest.php | 183 ----
.../twig/test/Twig/Tests/Node/PrintTest.php | 29 -
.../twig/test/Twig/Tests/Node/SandboxTest.php | 44 -
.../Twig/Tests/Node/SandboxedPrintTest.php | 33 -
.../twig/test/Twig/Tests/Node/SetTest.php | 69 --
.../test/Twig/Tests/Node/SpacelessTest.php | 37 -
.../twig/test/Twig/Tests/Node/TextTest.php | 28 -
.../Twig/Tests/NodeVisitor/OptimizerTest.php | 124 ---
.../twig/twig/test/Twig/Tests/ParserTest.php | 196 ----
.../Tests/Profiler/Dumper/AbstractTest.php | 101 --
.../Tests/Profiler/Dumper/BlackfireTest.php | 32 -
.../Twig/Tests/Profiler/Dumper/HtmlTest.php | 30 -
.../Twig/Tests/Profiler/Dumper/TextTest.php | 30 -
.../test/Twig/Tests/Profiler/ProfileTest.php | 100 --
.../twig/test/Twig/Tests/TemplateTest.php | 693 -------------
.../twig/test/Twig/Tests/TokenStreamTest.php | 70 --
.../twig/test/Twig/Tests/escapingTest.php | 320 ------
.../twig/vendor/twig/twig/test/bootstrap.php | 13 -
430 files changed, 19389 deletions(-)
delete mode 100644 plugins/twig/vendor/twig/twig/doc/advanced.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/api.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/coding_standards.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/deprecated.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/abs.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/batch.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/date.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/default.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/escape.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/first.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/format.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/index.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/join.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/keys.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/last.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/length.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/lower.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/merge.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/number_format.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/raw.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/replace.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/reverse.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/round.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/slice.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/sort.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/split.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/striptags.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/title.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/trim.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/upper.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/attribute.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/block.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/constant.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/cycle.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/date.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/dump.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/include.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/index.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/max.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/min.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/parent.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/random.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/range.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/source.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/index.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/installation.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/internals.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/intro.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/recipes.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/block.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/do.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/embed.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/extends.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/filter.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/flush.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/for.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/from.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/if.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/import.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/include.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/index.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/macro.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/sandbox.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/set.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/spaceless.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/use.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tags/verbatim.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/templates.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/constant.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/defined.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/divisibleby.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/empty.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/even.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/index.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/iterable.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/null.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/odd.rst
delete mode 100644 plugins/twig/vendor/twig/twig/doc/tests/sameas.rst
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/filename.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/LexerTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_empty_parent.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_nonexistent_parent.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_null_parent.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_valid_parent.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/parent.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/spare_parent.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme1/blocks.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme2/blocks.html.twig
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/ParserTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/Twig/Tests/escapingTest.php
delete mode 100644 plugins/twig/vendor/twig/twig/test/bootstrap.php
diff --git a/plugins/twig/vendor/twig/twig/doc/advanced.rst b/plugins/twig/vendor/twig/twig/doc/advanced.rst
deleted file mode 100644
index 5b436ff2..00000000
--- a/plugins/twig/vendor/twig/twig/doc/advanced.rst
+++ /dev/null
@@ -1,872 +0,0 @@
-Extending Twig
-==============
-
-.. caution::
-
- This section describes how to extend Twig as of **Twig 1.12**. If you are
- using an older version, read the :doc:`legacy` chapter
- instead.
-
-Twig can be extended in many ways; you can add extra tags, filters, tests,
-operators, global variables, and functions. You can even extend the parser
-itself with node visitors.
-
-.. note::
-
- The first section of this chapter describes how to extend Twig easily. If
- you want to reuse your changes in different projects or if you want to
- share them with others, you should then create an extension as described
- in the following section.
-
-.. caution::
-
- When extending Twig without creating an extension, Twig won't be able to
- recompile your templates when the PHP code is updated. To see your changes
- in real-time, either disable template caching or package your code into an
- extension (see the next section of this chapter).
-
-Before extending Twig, you must understand the differences between all the
-different possible extension points and when to use them.
-
-First, remember that Twig has two main language constructs:
-
-* ``{{ }}``: used to print the result of an expression evaluation;
-
-* ``{% %}``: used to execute statements.
-
-To understand why Twig exposes so many extension points, let's see how to
-implement a *Lorem ipsum* generator (it needs to know the number of words to
-generate).
-
-You can use a ``lipsum`` *tag*:
-
-.. code-block:: jinja
-
- {% lipsum 40 %}
-
-That works, but using a tag for ``lipsum`` is not a good idea for at least
-three main reasons:
-
-* ``lipsum`` is not a language construct;
-* The tag outputs something;
-* The tag is not flexible as you cannot use it in an expression:
-
- .. code-block:: jinja
-
- {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }}
-
-In fact, you rarely need to create tags; and that's good news because tags are
-the most complex extension point of Twig.
-
-Now, let's use a ``lipsum`` *filter*:
-
-.. code-block:: jinja
-
- {{ 40|lipsum }}
-
-Again, it works, but it looks weird. A filter transforms the passed value to
-something else but here we use the value to indicate the number of words to
-generate (so, ``40`` is an argument of the filter, not the value we want to
-transform).
-
-Next, let's use a ``lipsum`` *function*:
-
-.. code-block:: jinja
-
- {{ lipsum(40) }}
-
-Here we go. For this specific example, the creation of a function is the
-extension point to use. And you can use it anywhere an expression is accepted:
-
-.. code-block:: jinja
-
- {{ 'some text' ~ lipsum(40) ~ 'some more text' }}
-
- {% set lipsum = lipsum(40) %}
-
-Last but not the least, you can also use a *global* object with a method able
-to generate lorem ipsum text:
-
-.. code-block:: jinja
-
- {{ text.lipsum(40) }}
-
-As a rule of thumb, use functions for frequently used features and global
-objects for everything else.
-
-Keep in mind the following when you want to extend Twig:
-
-========== ========================== ========== =========================
-What? Implementation difficulty? How often? When?
-========== ========================== ========== =========================
-*macro* trivial frequent Content generation
-*global* trivial frequent Helper object
-*function* trivial frequent Content generation
-*filter* trivial frequent Value transformation
-*tag* complex rare DSL language construct
-*test* trivial rare Boolean decision
-*operator* trivial rare Values transformation
-========== ========================== ========== =========================
-
-Globals
--------
-
-A global variable is like any other template variable, except that it's
-available in all templates and macros::
-
- $twig = new Twig_Environment($loader);
- $twig->addGlobal('text', new Text());
-
-You can then use the ``text`` variable anywhere in a template:
-
-.. code-block:: jinja
-
- {{ text.lipsum(40) }}
-
-Filters
--------
-
-Creating a filter is as simple as associating a name with a PHP callable::
-
- // an anonymous function
- $filter = new Twig_SimpleFilter('rot13', function ($string) {
- return str_rot13($string);
- });
-
- // or a simple PHP function
- $filter = new Twig_SimpleFilter('rot13', 'str_rot13');
-
- // or a class method
- $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter'));
-
-The first argument passed to the ``Twig_SimpleFilter`` constructor is the name
-of the filter you will use in templates and the second one is the PHP callable
-to associate with it.
-
-Then, add the filter to your Twig environment::
-
- $twig = new Twig_Environment($loader);
- $twig->addFilter($filter);
-
-And here is how to use it in a template:
-
-.. code-block:: jinja
-
- {{ 'Twig'|rot13 }}
-
- {# will output Gjvt #}
-
-When called by Twig, the PHP callable receives the left side of the filter
-(before the pipe ``|``) as the first argument and the extra arguments passed
-to the filter (within parentheses ``()``) as extra arguments.
-
-For instance, the following code:
-
-.. code-block:: jinja
-
- {{ 'TWIG'|lower }}
- {{ now|date('d/m/Y') }}
-
-is compiled to something like the following::
-
-
-
-
-The ``Twig_SimpleFilter`` class takes an array of options as its last
-argument::
-
- $filter = new Twig_SimpleFilter('rot13', 'str_rot13', $options);
-
-Environment-aware Filters
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If you want to access the current environment instance in your filter, set the
-``needs_environment`` option to ``true``; Twig will pass the current
-environment as the first argument to the filter call::
-
- $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $string) {
- // get the current charset for instance
- $charset = $env->getCharset();
-
- return str_rot13($string);
- }, array('needs_environment' => true));
-
-Context-aware Filters
-~~~~~~~~~~~~~~~~~~~~~
-
-If you want to access the current context in your filter, set the
-``needs_context`` option to ``true``; Twig will pass the current context as
-the first argument to the filter call (or the second one if
-``needs_environment`` is also set to ``true``)::
-
- $filter = new Twig_SimpleFilter('rot13', function ($context, $string) {
- // ...
- }, array('needs_context' => true));
-
- $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $context, $string) {
- // ...
- }, array('needs_context' => true, 'needs_environment' => true));
-
-Automatic Escaping
-~~~~~~~~~~~~~~~~~~
-
-If automatic escaping is enabled, the output of the filter may be escaped
-before printing. If your filter acts as an escaper (or explicitly outputs HTML
-or JavaScript code), you will want the raw output to be printed. In such a
-case, set the ``is_safe`` option::
-
- $filter = new Twig_SimpleFilter('nl2br', 'nl2br', array('is_safe' => array('html')));
-
-Some filters may need to work on input that is already escaped or safe, for
-example when adding (safe) HTML tags to originally unsafe output. In such a
-case, set the ``pre_escape`` option to escape the input data before it is run
-through your filter::
-
- $filter = new Twig_SimpleFilter('somefilter', 'somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
-
-Variadic Filters
-~~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.19
- Support for variadic filters was added in Twig 1.19.
-
-When a filter should accept an arbitrary number of arguments, set the
-``is_variadic`` option to ``true``; Twig will pass the extra arguments as the
-last argument to the filter call as an array::
-
- $filter = new Twig_SimpleFilter('thumbnail', function ($file, array $options = array()) {
- // ...
- }, array('is_variadic' => true));
-
-Be warned that named arguments passed to a variadic filter cannot be checked
-for validity as they will automatically end up in the option array.
-
-Dynamic Filters
-~~~~~~~~~~~~~~~
-
-A filter name containing the special ``*`` character is a dynamic filter as
-the ``*`` can be any string::
-
- $filter = new Twig_SimpleFilter('*_path', function ($name, $arguments) {
- // ...
- });
-
-The following filters will be matched by the above defined dynamic filter:
-
-* ``product_path``
-* ``category_path``
-
-A dynamic filter can define more than one dynamic parts::
-
- $filter = new Twig_SimpleFilter('*_path_*', function ($name, $suffix, $arguments) {
- // ...
- });
-
-The filter will receive all dynamic part values before the normal filter
-arguments, but after the environment and the context. For instance, a call to
-``'foo'|a_path_b()`` will result in the following arguments to be passed to
-the filter: ``('a', 'b', 'foo')``.
-
-Deprecated Filters
-~~~~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.21
- Support for deprecated filters was added in Twig 1.21.
-
-You can mark a filter as being deprecated by setting the ``deprecated`` option
-to ``true``. You can also give an alternative filter that replaces the
-deprecated one when that makes sense::
-
- $filter = new Twig_SimpleFilter('obsolete', function () {
- // ...
- }, array('deprecated' => true, 'alternative' => 'new_one'));
-
-When a filter is deprecated, Twig emits a deprecation notice when compiling a
-template using it. See :ref:`deprecation-notices` for more information.
-
-Functions
----------
-
-Functions are defined in the exact same way as filters, but you need to create
-an instance of ``Twig_SimpleFunction``::
-
- $twig = new Twig_Environment($loader);
- $function = new Twig_SimpleFunction('function_name', function () {
- // ...
- });
- $twig->addFunction($function);
-
-Functions support the same features as filters, except for the ``pre_escape``
-and ``preserves_safety`` options.
-
-Tests
------
-
-Tests are defined in the exact same way as filters and functions, but you need
-to create an instance of ``Twig_SimpleTest``::
-
- $twig = new Twig_Environment($loader);
- $test = new Twig_SimpleTest('test_name', function () {
- // ...
- });
- $twig->addTest($test);
-
-Tests allow you to create custom application specific logic for evaluating
-boolean conditions. As a simple example, let's create a Twig test that checks if
-objects are 'red'::
-
- $twig = new Twig_Environment($loader);
- $test = new Twig_SimpleTest('red', function ($value) {
- if (isset($value->color) && $value->color == 'red') {
- return true;
- }
- if (isset($value->paint) && $value->paint == 'red') {
- return true;
- }
- return false;
- });
- $twig->addTest($test);
-
-Test functions should always return true/false.
-
-When creating tests you can use the ``node_class`` option to provide custom test
-compilation. This is useful if your test can be compiled into PHP primitives.
-This is used by many of the tests built into Twig::
-
- $twig = new Twig_Environment($loader);
- $test = new Twig_SimpleTest(
- 'odd',
- null,
- array('node_class' => 'Twig_Node_Expression_Test_Odd'));
- $twig->addTest($test);
-
- class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test
- {
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' % 2 == 1')
- ->raw(')')
- ;
- }
- }
-
-The above example shows how you can create tests that use a node class. The
-node class has access to one sub-node called 'node'. This sub-node contains the
-value that is being tested. When the ``odd`` filter is used in code such as:
-
-.. code-block:: jinja
-
- {% if my_value is odd %}
-
-The ``node`` sub-node will contain an expression of ``my_value``. Node-based
-tests also have access to the ``arguments`` node. This node will contain the
-various other arguments that have been provided to your test.
-
-If you want to pass a variable number of positional or named arguments to the
-test, set the ``is_variadic`` option to ``true``. Tests also support dynamic
-name feature as filters and functions.
-
-Tags
-----
-
-One of the most exciting features of a template engine like Twig is the
-possibility to define new language constructs. This is also the most complex
-feature as you need to understand how Twig's internals work.
-
-Let's create a simple ``set`` tag that allows the definition of simple
-variables from within a template. The tag can be used like follows:
-
-.. code-block:: jinja
-
- {% set name = "value" %}
-
- {{ name }}
-
- {# should output value #}
-
-.. note::
-
- The ``set`` tag is part of the Core extension and as such is always
- available. The built-in version is slightly more powerful and supports
- multiple assignments by default (cf. the template designers chapter for
- more information).
-
-Three steps are needed to define a new tag:
-
-* Defining a Token Parser class (responsible for parsing the template code);
-
-* Defining a Node class (responsible for converting the parsed code to PHP);
-
-* Registering the tag.
-
-Registering a new tag
-~~~~~~~~~~~~~~~~~~~~~
-
-Adding a tag is as simple as calling the ``addTokenParser`` method on the
-``Twig_Environment`` instance::
-
- $twig = new Twig_Environment($loader);
- $twig->addTokenParser(new Project_Set_TokenParser());
-
-Defining a Token Parser
-~~~~~~~~~~~~~~~~~~~~~~~
-
-Now, let's see the actual code of this class::
-
- class Project_Set_TokenParser extends Twig_TokenParser
- {
- public function parse(Twig_Token $token)
- {
- $parser = $this->parser;
- $stream = $parser->getStream();
-
- $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
- $stream->expect(Twig_Token::OPERATOR_TYPE, '=');
- $value = $parser->getExpressionParser()->parseExpression();
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Project_Set_Node($name, $value, $token->getLine(), $this->getTag());
- }
-
- public function getTag()
- {
- return 'set';
- }
- }
-
-The ``getTag()`` method must return the tag we want to parse, here ``set``.
-
-The ``parse()`` method is invoked whenever the parser encounters a ``set``
-tag. It should return a ``Twig_Node`` instance that represents the node (the
-``Project_Set_Node`` calls creating is explained in the next section).
-
-The parsing process is simplified thanks to a bunch of methods you can call
-from the token stream (``$this->parser->getStream()``):
-
-* ``getCurrent()``: Gets the current token in the stream.
-
-* ``next()``: Moves to the next token in the stream, *but returns the old one*.
-
-* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether
- the current token is of a particular type or value (or both). The value may be an
- array of several possible values.
-
-* ``expect($type[, $value[, $message]])``: If the current token isn't of the given
- type/value a syntax error is thrown. Otherwise, if the type and value are correct,
- the token is returned and the stream moves to the next token.
-
-* ``look()``: Looks a the next token without consuming it.
-
-Parsing expressions is done by calling the ``parseExpression()`` like we did for
-the ``set`` tag.
-
-.. tip::
-
- Reading the existing ``TokenParser`` classes is the best way to learn all
- the nitty-gritty details of the parsing process.
-
-Defining a Node
-~~~~~~~~~~~~~~~
-
-The ``Project_Set_Node`` class itself is rather simple::
-
- class Project_Set_Node extends Twig_Node
- {
- public function __construct($name, Twig_Node_Expression $value, $line, $tag = null)
- {
- parent::__construct(array('value' => $value), array('name' => $name), $line, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('$context[\''.$this->getAttribute('name').'\'] = ')
- ->subcompile($this->getNode('value'))
- ->raw(";\n")
- ;
- }
- }
-
-The compiler implements a fluid interface and provides methods that helps the
-developer generate beautiful and readable PHP code:
-
-* ``subcompile()``: Compiles a node.
-
-* ``raw()``: Writes the given string as is.
-
-* ``write()``: Writes the given string by adding indentation at the beginning
- of each line.
-
-* ``string()``: Writes a quoted string.
-
-* ``repr()``: Writes a PHP representation of a given value (see
- ``Twig_Node_For`` for a usage example).
-
-* ``addDebugInfo()``: Adds the line of the original template file related to
- the current node as a comment.
-
-* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a
- usage example).
-
-* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a
- usage example).
-
-.. _creating_extensions:
-
-Creating an Extension
----------------------
-
-The main motivation for writing an extension is to move often used code into a
-reusable class like adding support for internationalization. An extension can
-define tags, filters, tests, operators, global variables, functions, and node
-visitors.
-
-Creating an extension also makes for a better separation of code that is
-executed at compilation time and code needed at runtime. As such, it makes
-your code faster.
-
-Most of the time, it is useful to create a single extension for your project,
-to host all the specific tags and filters you want to add to Twig.
-
-.. tip::
-
- When packaging your code into an extension, Twig is smart enough to
- recompile your templates whenever you make a change to it (when
- ``auto_reload`` is enabled).
-
-.. note::
-
- Before writing your own extensions, have a look at the Twig official
- extension repository: http://github.com/twigphp/Twig-extensions.
-
-An extension is a class that implements the following interface::
-
- interface Twig_ExtensionInterface
- {
- /**
- * Initializes the runtime environment.
- *
- * This is where you can load some file that contains filter functions for instance.
- *
- * @param Twig_Environment $environment The current Twig_Environment instance
- *
- * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead
- */
- function initRuntime(Twig_Environment $environment);
-
- /**
- * Returns the token parser instances to add to the existing list.
- *
- * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
- */
- function getTokenParsers();
-
- /**
- * Returns the node visitor instances to add to the existing list.
- *
- * @return array An array of Twig_NodeVisitorInterface instances
- */
- function getNodeVisitors();
-
- /**
- * Returns a list of filters to add to the existing list.
- *
- * @return array An array of filters
- */
- function getFilters();
-
- /**
- * Returns a list of tests to add to the existing list.
- *
- * @return array An array of tests
- */
- function getTests();
-
- /**
- * Returns a list of functions to add to the existing list.
- *
- * @return array An array of functions
- */
- function getFunctions();
-
- /**
- * Returns a list of operators to add to the existing list.
- *
- * @return array An array of operators
- */
- function getOperators();
-
- /**
- * Returns a list of global variables to add to the existing list.
- *
- * @return array An array of global variables
- *
- * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead
- */
- function getGlobals();
-
- /**
- * Returns the name of the extension.
- *
- * @return string The extension name
- */
- function getName();
- }
-
-To keep your extension class clean and lean, it can inherit from the built-in
-``Twig_Extension`` class instead of implementing the whole interface. That
-way, you just need to implement the ``getName()`` method as the
-``Twig_Extension`` provides empty implementations for all other methods.
-
-The ``getName()`` method must return a unique identifier for your extension.
-
-Now, with this information in mind, let's create the most basic extension
-possible::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getName()
- {
- return 'project';
- }
- }
-
-.. note::
-
- Of course, this extension does nothing for now. We will customize it in
- the next sections.
-
-Twig does not care where you save your extension on the filesystem, as all
-extensions must be registered explicitly to be available in your templates.
-
-You can register an extension by using the ``addExtension()`` method on your
-main ``Environment`` object::
-
- $twig = new Twig_Environment($loader);
- $twig->addExtension(new Project_Twig_Extension());
-
-.. tip::
-
- The bundled extensions are great examples of how extensions work.
-
-Globals
-~~~~~~~
-
-Global variables can be registered in an extension via the ``getGlobals()``
-method::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getGlobals()
- {
- return array(
- 'text' => new Text(),
- );
- }
-
- // ...
- }
-
-Functions
-~~~~~~~~~
-
-Functions can be registered in an extension via the ``getFunctions()``
-method::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getFunctions()
- {
- return array(
- new Twig_SimpleFunction('lipsum', 'generate_lipsum'),
- );
- }
-
- // ...
- }
-
-Filters
-~~~~~~~
-
-To add a filter to an extension, you need to override the ``getFilters()``
-method. This method must return an array of filters to add to the Twig
-environment::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getFilters()
- {
- return array(
- new Twig_SimpleFilter('rot13', 'str_rot13'),
- );
- }
-
- // ...
- }
-
-Tags
-~~~~
-
-Adding a tag in an extension can be done by overriding the
-``getTokenParsers()`` method. This method must return an array of tags to add
-to the Twig environment::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getTokenParsers()
- {
- return array(new Project_Set_TokenParser());
- }
-
- // ...
- }
-
-In the above code, we have added a single new tag, defined by the
-``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is
-responsible for parsing the tag and compiling it to PHP.
-
-Operators
-~~~~~~~~~
-
-The ``getOperators()`` methods lets you add new operators. Here is how to add
-``!``, ``||``, and ``&&`` operators::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getOperators()
- {
- return array(
- array(
- '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
- ),
- array(
- '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- ),
- );
- }
-
- // ...
- }
-
-Tests
-~~~~~
-
-The ``getTests()`` method lets you add new test functions::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getTests()
- {
- return array(
- new Twig_SimpleTest('even', 'twig_test_even'),
- );
- }
-
- // ...
- }
-
-Overloading
------------
-
-To overload an already defined filter, test, operator, global variable, or
-function, re-define it in an extension and register it **as late as
-possible** (order matters)::
-
- class MyCoreExtension extends Twig_Extension
- {
- public function getFilters()
- {
- return array(
- new Twig_SimpleFilter('date', array($this, 'dateFilter')),
- );
- }
-
- public function dateFilter($timestamp, $format = 'F j, Y H:i')
- {
- // do something different from the built-in date filter
- }
-
- public function getName()
- {
- return 'project';
- }
- }
-
- $twig = new Twig_Environment($loader);
- $twig->addExtension(new MyCoreExtension());
-
-Here, we have overloaded the built-in ``date`` filter with a custom one.
-
-If you do the same on the Twig_Environment itself, beware that it takes
-precedence over any other registered extensions::
-
- $twig = new Twig_Environment($loader);
- $twig->addFilter(new Twig_SimpleFilter('date', function ($timestamp, $format = 'F j, Y H:i') {
- // do something different from the built-in date filter
- }));
- // the date filter will come from the above registration, not
- // from the registered extension below
- $twig->addExtension(new MyCoreExtension());
-
-.. caution::
-
- Note that overloading the built-in Twig elements is not recommended as it
- might be confusing.
-
-Testing an Extension
---------------------
-
-Functional Tests
-~~~~~~~~~~~~~~~~
-
-You can create functional tests for extensions simply by creating the
-following file structure in your test directory::
-
- Fixtures/
- filters/
- foo.test
- bar.test
- functions/
- foo.test
- bar.test
- tags/
- foo.test
- bar.test
- IntegrationTest.php
-
-The ``IntegrationTest.php`` file should look like this::
-
- class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
- {
- public function getExtensions()
- {
- return array(
- new Project_Twig_Extension1(),
- new Project_Twig_Extension2(),
- );
- }
-
- public function getFixturesDir()
- {
- return dirname(__FILE__).'/Fixtures/';
- }
- }
-
-Fixtures examples can be found within the Twig repository
-`tests/Twig/Fixtures`_ directory.
-
-Node Tests
-~~~~~~~~~~
-
-Testing the node visitors can be complex, so extend your test cases from
-``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository
-`tests/Twig/Node`_ directory.
-
-.. _`rot13`: http://www.php.net/manual/en/function.str-rot13.php
-.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures
-.. _`tests/Twig/Node`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node
diff --git a/plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst b/plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst
deleted file mode 100644
index 2ef6bfde..00000000
--- a/plugins/twig/vendor/twig/twig/doc/advanced_legacy.rst
+++ /dev/null
@@ -1,887 +0,0 @@
-Extending Twig
-==============
-
-.. caution::
-
- This section describes how to extends Twig for versions **older than
- 1.12**. If you are using a newer version, read the :doc:`newer`
- chapter instead.
-
-Twig can be extended in many ways; you can add extra tags, filters, tests,
-operators, global variables, and functions. You can even extend the parser
-itself with node visitors.
-
-.. note::
-
- The first section of this chapter describes how to extend Twig easily. If
- you want to reuse your changes in different projects or if you want to
- share them with others, you should then create an extension as described
- in the following section.
-
-.. caution::
-
- When extending Twig by calling methods on the Twig environment instance,
- Twig won't be able to recompile your templates when the PHP code is
- updated. To see your changes in real-time, either disable template caching
- or package your code into an extension (see the next section of this
- chapter).
-
-Before extending Twig, you must understand the differences between all the
-different possible extension points and when to use them.
-
-First, remember that Twig has two main language constructs:
-
-* ``{{ }}``: used to print the result of an expression evaluation;
-
-* ``{% %}``: used to execute statements.
-
-To understand why Twig exposes so many extension points, let's see how to
-implement a *Lorem ipsum* generator (it needs to know the number of words to
-generate).
-
-You can use a ``lipsum`` *tag*:
-
-.. code-block:: jinja
-
- {% lipsum 40 %}
-
-That works, but using a tag for ``lipsum`` is not a good idea for at least
-three main reasons:
-
-* ``lipsum`` is not a language construct;
-* The tag outputs something;
-* The tag is not flexible as you cannot use it in an expression:
-
- .. code-block:: jinja
-
- {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }}
-
-In fact, you rarely need to create tags; and that's good news because tags are
-the most complex extension point of Twig.
-
-Now, let's use a ``lipsum`` *filter*:
-
-.. code-block:: jinja
-
- {{ 40|lipsum }}
-
-Again, it works, but it looks weird. A filter transforms the passed value to
-something else but here we use the value to indicate the number of words to
-generate (so, ``40`` is an argument of the filter, not the value we want to
-transform).
-
-Next, let's use a ``lipsum`` *function*:
-
-.. code-block:: jinja
-
- {{ lipsum(40) }}
-
-Here we go. For this specific example, the creation of a function is the
-extension point to use. And you can use it anywhere an expression is accepted:
-
-.. code-block:: jinja
-
- {{ 'some text' ~ ipsum(40) ~ 'some more text' }}
-
- {% set ipsum = ipsum(40) %}
-
-Last but not the least, you can also use a *global* object with a method able
-to generate lorem ipsum text:
-
-.. code-block:: jinja
-
- {{ text.lipsum(40) }}
-
-As a rule of thumb, use functions for frequently used features and global
-objects for everything else.
-
-Keep in mind the following when you want to extend Twig:
-
-========== ========================== ========== =========================
-What? Implementation difficulty? How often? When?
-========== ========================== ========== =========================
-*macro* trivial frequent Content generation
-*global* trivial frequent Helper object
-*function* trivial frequent Content generation
-*filter* trivial frequent Value transformation
-*tag* complex rare DSL language construct
-*test* trivial rare Boolean decision
-*operator* trivial rare Values transformation
-========== ========================== ========== =========================
-
-Globals
--------
-
-A global variable is like any other template variable, except that it's
-available in all templates and macros::
-
- $twig = new Twig_Environment($loader);
- $twig->addGlobal('text', new Text());
-
-You can then use the ``text`` variable anywhere in a template:
-
-.. code-block:: jinja
-
- {{ text.lipsum(40) }}
-
-Filters
--------
-
-A filter is a regular PHP function or an object method that takes the left
-side of the filter (before the pipe ``|``) as first argument and the extra
-arguments passed to the filter (within parentheses ``()``) as extra arguments.
-
-Defining a filter is as easy as associating the filter name with a PHP
-callable. For instance, let's say you have the following code in a template:
-
-.. code-block:: jinja
-
- {{ 'TWIG'|lower }}
-
-When compiling this template to PHP, Twig looks for the PHP callable
-associated with the ``lower`` filter. The ``lower`` filter is a built-in Twig
-filter, and it is simply mapped to the PHP ``strtolower()`` function. After
-compilation, the generated PHP code is roughly equivalent to:
-
-.. code-block:: html+php
-
-
-
-As you can see, the ``'TWIG'`` string is passed as a first argument to the PHP
-function.
-
-A filter can also take extra arguments like in the following example:
-
-.. code-block:: jinja
-
- {{ now|date('d/m/Y') }}
-
-In this case, the extra arguments are passed to the function after the main
-argument, and the compiled code is equivalent to:
-
-.. code-block:: html+php
-
-
-
-Let's see how to create a new filter.
-
-In this section, we will create a ``rot13`` filter, which should return the
-`rot13`_ transformation of a string. Here is an example of its usage and the
-expected output:
-
-.. code-block:: jinja
-
- {{ "Twig"|rot13 }}
-
- {# should displays Gjvt #}
-
-Adding a filter is as simple as calling the ``addFilter()`` method on the
-``Twig_Environment`` instance::
-
- $twig = new Twig_Environment($loader);
- $twig->addFilter('rot13', new Twig_Filter_Function('str_rot13'));
-
-The second argument of ``addFilter()`` is an instance of ``Twig_Filter``.
-Here, we use ``Twig_Filter_Function`` as the filter is a PHP function. The
-first argument passed to the ``Twig_Filter_Function`` constructor is the name
-of the PHP function to call, here ``str_rot13``, a native PHP function.
-
-Let's say I now want to be able to add a prefix before the converted string:
-
-.. code-block:: jinja
-
- {{ "Twig"|rot13('prefix_') }}
-
- {# should displays prefix_Gjvt #}
-
-As the PHP ``str_rot13()`` function does not support this requirement, let's
-create a new PHP function::
-
- function project_compute_rot13($string, $prefix = '')
- {
- return $prefix.str_rot13($string);
- }
-
-As you can see, the ``prefix`` argument of the filter is passed as an extra
-argument to the ``project_compute_rot13()`` function.
-
-Adding this filter is as easy as before::
-
- $twig->addFilter('rot13', new Twig_Filter_Function('project_compute_rot13'));
-
-For better encapsulation, a filter can also be defined as a static method of a
-class. The ``Twig_Filter_Function`` class can also be used to register such
-static methods as filters::
-
- $twig->addFilter('rot13', new Twig_Filter_Function('SomeClass::rot13Filter'));
-
-.. tip::
-
- In an extension, you can also define a filter as a static method of the
- extension class.
-
-Environment aware Filters
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The ``Twig_Filter`` classes take options as their last argument. For instance,
-if you want access to the current environment instance in your filter, set the
-``needs_environment`` option to ``true``::
-
- $filter = new Twig_Filter_Function('str_rot13', array('needs_environment' => true));
-
-Twig will then pass the current environment as the first argument to the
-filter call::
-
- function twig_compute_rot13(Twig_Environment $env, $string)
- {
- // get the current charset for instance
- $charset = $env->getCharset();
-
- return str_rot13($string);
- }
-
-Automatic Escaping
-~~~~~~~~~~~~~~~~~~
-
-If automatic escaping is enabled, the output of the filter may be escaped
-before printing. If your filter acts as an escaper (or explicitly outputs HTML
-or JavaScript code), you will want the raw output to be printed. In such a
-case, set the ``is_safe`` option::
-
- $filter = new Twig_Filter_Function('nl2br', array('is_safe' => array('html')));
-
-Some filters may need to work on input that is already escaped or safe, for
-example when adding (safe) HTML tags to originally unsafe output. In such a
-case, set the ``pre_escape`` option to escape the input data before it is run
-through your filter::
-
- $filter = new Twig_Filter_Function('somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
-
-Dynamic Filters
-~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.5
- Dynamic filters support was added in Twig 1.5.
-
-A filter name containing the special ``*`` character is a dynamic filter as
-the ``*`` can be any string::
-
- $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
- function twig_path($name, $arguments)
- {
- // ...
- }
-
-The following filters will be matched by the above defined dynamic filter:
-
-* ``product_path``
-* ``category_path``
-
-A dynamic filter can define more than one dynamic parts::
-
- $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
- function twig_path($name, $suffix, $arguments)
- {
- // ...
- }
-
-The filter will receive all dynamic part values before the normal filters
-arguments. For instance, a call to ``'foo'|a_path_b()`` will result in the
-following PHP call: ``twig_path('a', 'b', 'foo')``.
-
-Functions
----------
-
-A function is a regular PHP function or an object method that can be called from
-templates.
-
-.. code-block:: jinja
-
- {{ constant("DATE_W3C") }}
-
-When compiling this template to PHP, Twig looks for the PHP callable
-associated with the ``constant`` function. The ``constant`` function is a built-in Twig
-function, and it is simply mapped to the PHP ``constant()`` function. After
-compilation, the generated PHP code is roughly equivalent to:
-
-.. code-block:: html+php
-
-
-
-Adding a function is similar to adding a filter. This can be done by calling the
-``addFunction()`` method on the ``Twig_Environment`` instance::
-
- $twig = new Twig_Environment($loader);
- $twig->addFunction('functionName', new Twig_Function_Function('someFunction'));
-
-You can also expose extension methods as functions in your templates::
-
- // $this is an object that implements Twig_ExtensionInterface.
- $twig = new Twig_Environment($loader);
- $twig->addFunction('otherFunction', new Twig_Function_Method($this, 'someMethod'));
-
-Functions also support ``needs_environment`` and ``is_safe`` parameters.
-
-Dynamic Functions
-~~~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.5
- Dynamic functions support was added in Twig 1.5.
-
-A function name containing the special ``*`` character is a dynamic function
-as the ``*`` can be any string::
-
- $twig->addFunction('*_path', new Twig_Function_Function('twig_path'));
-
- function twig_path($name, $arguments)
- {
- // ...
- }
-
-The following functions will be matched by the above defined dynamic function:
-
-* ``product_path``
-* ``category_path``
-
-A dynamic function can define more than one dynamic parts::
-
- $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
- function twig_path($name, $suffix, $arguments)
- {
- // ...
- }
-
-The function will receive all dynamic part values before the normal functions
-arguments. For instance, a call to ``a_path_b('foo')`` will result in the
-following PHP call: ``twig_path('a', 'b', 'foo')``.
-
-Tags
-----
-
-One of the most exciting feature of a template engine like Twig is the
-possibility to define new language constructs. This is also the most complex
-feature as you need to understand how Twig's internals work.
-
-Let's create a simple ``set`` tag that allows the definition of simple
-variables from within a template. The tag can be used like follows:
-
-.. code-block:: jinja
-
- {% set name = "value" %}
-
- {{ name }}
-
- {# should output value #}
-
-.. note::
-
- The ``set`` tag is part of the Core extension and as such is always
- available. The built-in version is slightly more powerful and supports
- multiple assignments by default (cf. the template designers chapter for
- more information).
-
-Three steps are needed to define a new tag:
-
-* Defining a Token Parser class (responsible for parsing the template code);
-
-* Defining a Node class (responsible for converting the parsed code to PHP);
-
-* Registering the tag.
-
-Registering a new tag
-~~~~~~~~~~~~~~~~~~~~~
-
-Adding a tag is as simple as calling the ``addTokenParser`` method on the
-``Twig_Environment`` instance::
-
- $twig = new Twig_Environment($loader);
- $twig->addTokenParser(new Project_Set_TokenParser());
-
-Defining a Token Parser
-~~~~~~~~~~~~~~~~~~~~~~~
-
-Now, let's see the actual code of this class::
-
- class Project_Set_TokenParser extends Twig_TokenParser
- {
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $name = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();
- $this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE, '=');
- $value = $this->parser->getExpressionParser()->parseExpression();
-
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Project_Set_Node($name, $value, $lineno, $this->getTag());
- }
-
- public function getTag()
- {
- return 'set';
- }
- }
-
-The ``getTag()`` method must return the tag we want to parse, here ``set``.
-
-The ``parse()`` method is invoked whenever the parser encounters a ``set``
-tag. It should return a ``Twig_Node`` instance that represents the node (the
-``Project_Set_Node`` calls creating is explained in the next section).
-
-The parsing process is simplified thanks to a bunch of methods you can call
-from the token stream (``$this->parser->getStream()``):
-
-* ``getCurrent()``: Gets the current token in the stream.
-
-* ``next()``: Moves to the next token in the stream, *but returns the old one*.
-
-* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether
- the current token is of a particular type or value (or both). The value may be an
- array of several possible values.
-
-* ``expect($type[, $value[, $message]])``: If the current token isn't of the given
- type/value a syntax error is thrown. Otherwise, if the type and value are correct,
- the token is returned and the stream moves to the next token.
-
-* ``look()``: Looks a the next token without consuming it.
-
-Parsing expressions is done by calling the ``parseExpression()`` like we did for
-the ``set`` tag.
-
-.. tip::
-
- Reading the existing ``TokenParser`` classes is the best way to learn all
- the nitty-gritty details of the parsing process.
-
-Defining a Node
-~~~~~~~~~~~~~~~
-
-The ``Project_Set_Node`` class itself is rather simple::
-
- class Project_Set_Node extends Twig_Node
- {
- public function __construct($name, Twig_Node_Expression $value, $lineno, $tag = null)
- {
- parent::__construct(array('value' => $value), array('name' => $name), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('$context[\''.$this->getAttribute('name').'\'] = ')
- ->subcompile($this->getNode('value'))
- ->raw(";\n")
- ;
- }
- }
-
-The compiler implements a fluid interface and provides methods that helps the
-developer generate beautiful and readable PHP code:
-
-* ``subcompile()``: Compiles a node.
-
-* ``raw()``: Writes the given string as is.
-
-* ``write()``: Writes the given string by adding indentation at the beginning
- of each line.
-
-* ``string()``: Writes a quoted string.
-
-* ``repr()``: Writes a PHP representation of a given value (see
- ``Twig_Node_For`` for a usage example).
-
-* ``addDebugInfo()``: Adds the line of the original template file related to
- the current node as a comment.
-
-* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a
- usage example).
-
-* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a
- usage example).
-
-.. _creating_extensions:
-
-Creating an Extension
----------------------
-
-The main motivation for writing an extension is to move often used code into a
-reusable class like adding support for internationalization. An extension can
-define tags, filters, tests, operators, global variables, functions, and node
-visitors.
-
-Creating an extension also makes for a better separation of code that is
-executed at compilation time and code needed at runtime. As such, it makes
-your code faster.
-
-Most of the time, it is useful to create a single extension for your project,
-to host all the specific tags and filters you want to add to Twig.
-
-.. tip::
-
- When packaging your code into an extension, Twig is smart enough to
- recompile your templates whenever you make a change to it (when the
- ``auto_reload`` is enabled).
-
-.. note::
-
- Before writing your own extensions, have a look at the Twig official
- extension repository: http://github.com/twigphp/Twig-extensions.
-
-An extension is a class that implements the following interface::
-
- interface Twig_ExtensionInterface
- {
- /**
- * Initializes the runtime environment.
- *
- * This is where you can load some file that contains filter functions for instance.
- *
- * @param Twig_Environment $environment The current Twig_Environment instance
- */
- function initRuntime(Twig_Environment $environment);
-
- /**
- * Returns the token parser instances to add to the existing list.
- *
- * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
- */
- function getTokenParsers();
-
- /**
- * Returns the node visitor instances to add to the existing list.
- *
- * @return array An array of Twig_NodeVisitorInterface instances
- */
- function getNodeVisitors();
-
- /**
- * Returns a list of filters to add to the existing list.
- *
- * @return array An array of filters
- */
- function getFilters();
-
- /**
- * Returns a list of tests to add to the existing list.
- *
- * @return array An array of tests
- */
- function getTests();
-
- /**
- * Returns a list of functions to add to the existing list.
- *
- * @return array An array of functions
- */
- function getFunctions();
-
- /**
- * Returns a list of operators to add to the existing list.
- *
- * @return array An array of operators
- */
- function getOperators();
-
- /**
- * Returns a list of global variables to add to the existing list.
- *
- * @return array An array of global variables
- */
- function getGlobals();
-
- /**
- * Returns the name of the extension.
- *
- * @return string The extension name
- */
- function getName();
- }
-
-To keep your extension class clean and lean, it can inherit from the built-in
-``Twig_Extension`` class instead of implementing the whole interface. That
-way, you just need to implement the ``getName()`` method as the
-``Twig_Extension`` provides empty implementations for all other methods.
-
-The ``getName()`` method must return a unique identifier for your extension.
-
-Now, with this information in mind, let's create the most basic extension
-possible::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getName()
- {
- return 'project';
- }
- }
-
-.. note::
-
- Of course, this extension does nothing for now. We will customize it in
- the next sections.
-
-Twig does not care where you save your extension on the filesystem, as all
-extensions must be registered explicitly to be available in your templates.
-
-You can register an extension by using the ``addExtension()`` method on your
-main ``Environment`` object::
-
- $twig = new Twig_Environment($loader);
- $twig->addExtension(new Project_Twig_Extension());
-
-Of course, you need to first load the extension file by either using
-``require_once()`` or by using an autoloader (see `spl_autoload_register()`_).
-
-.. tip::
-
- The bundled extensions are great examples of how extensions work.
-
-Globals
-~~~~~~~
-
-Global variables can be registered in an extension via the ``getGlobals()``
-method::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getGlobals()
- {
- return array(
- 'text' => new Text(),
- );
- }
-
- // ...
- }
-
-Functions
-~~~~~~~~~
-
-Functions can be registered in an extension via the ``getFunctions()``
-method::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getFunctions()
- {
- return array(
- 'lipsum' => new Twig_Function_Function('generate_lipsum'),
- );
- }
-
- // ...
- }
-
-Filters
-~~~~~~~
-
-To add a filter to an extension, you need to override the ``getFilters()``
-method. This method must return an array of filters to add to the Twig
-environment::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getFilters()
- {
- return array(
- 'rot13' => new Twig_Filter_Function('str_rot13'),
- );
- }
-
- // ...
- }
-
-As you can see in the above code, the ``getFilters()`` method returns an array
-where keys are the name of the filters (``rot13``) and the values the
-definition of the filter (``new Twig_Filter_Function('str_rot13')``).
-
-As seen in the previous chapter, you can also define filters as static methods
-on the extension class::
-
-$twig->addFilter('rot13', new Twig_Filter_Function('Project_Twig_Extension::rot13Filter'));
-
-You can also use ``Twig_Filter_Method`` instead of ``Twig_Filter_Function``
-when defining a filter to use a method::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getFilters()
- {
- return array(
- 'rot13' => new Twig_Filter_Method($this, 'rot13Filter'),
- );
- }
-
- public function rot13Filter($string)
- {
- return str_rot13($string);
- }
-
- // ...
- }
-
-The first argument of the ``Twig_Filter_Method`` constructor is always
-``$this``, the current extension object. The second one is the name of the
-method to call.
-
-Using methods for filters is a great way to package your filter without
-polluting the global namespace. This also gives the developer more flexibility
-at the cost of a small overhead.
-
-Overriding default Filters
-..........................
-
-If some default core filters do not suit your needs, you can easily override
-them by creating your own extension. Just use the same names as the one you
-want to override::
-
- class MyCoreExtension extends Twig_Extension
- {
- public function getFilters()
- {
- return array(
- 'date' => new Twig_Filter_Method($this, 'dateFilter'),
- // ...
- );
- }
-
- public function dateFilter($timestamp, $format = 'F j, Y H:i')
- {
- return '...'.twig_date_format_filter($timestamp, $format);
- }
-
- public function getName()
- {
- return 'project';
- }
- }
-
-Here, we override the ``date`` filter with a custom one. Using this extension
-is as simple as registering the ``MyCoreExtension`` extension by calling the
-``addExtension()`` method on the environment instance::
-
- $twig = new Twig_Environment($loader);
- $twig->addExtension(new MyCoreExtension());
-
-Tags
-~~~~
-
-Adding a tag in an extension can be done by overriding the
-``getTokenParsers()`` method. This method must return an array of tags to add
-to the Twig environment::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getTokenParsers()
- {
- return array(new Project_Set_TokenParser());
- }
-
- // ...
- }
-
-In the above code, we have added a single new tag, defined by the
-``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is
-responsible for parsing the tag and compiling it to PHP.
-
-Operators
-~~~~~~~~~
-
-The ``getOperators()`` methods allows to add new operators. Here is how to add
-``!``, ``||``, and ``&&`` operators::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getOperators()
- {
- return array(
- array(
- '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
- ),
- array(
- '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- ),
- );
- }
-
- // ...
- }
-
-Tests
-~~~~~
-
-The ``getTests()`` methods allows to add new test functions::
-
- class Project_Twig_Extension extends Twig_Extension
- {
- public function getTests()
- {
- return array(
- 'even' => new Twig_Test_Function('twig_test_even'),
- );
- }
-
- // ...
- }
-
-Testing an Extension
---------------------
-
-.. versionadded:: 1.10
- Support for functional tests was added in Twig 1.10.
-
-Functional Tests
-~~~~~~~~~~~~~~~~
-
-You can create functional tests for extensions simply by creating the
-following file structure in your test directory::
-
- Fixtures/
- filters/
- foo.test
- bar.test
- functions/
- foo.test
- bar.test
- tags/
- foo.test
- bar.test
- IntegrationTest.php
-
-The ``IntegrationTest.php`` file should look like this::
-
- class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
- {
- public function getExtensions()
- {
- return array(
- new Project_Twig_Extension1(),
- new Project_Twig_Extension2(),
- );
- }
-
- public function getFixturesDir()
- {
- return dirname(__FILE__).'/Fixtures/';
- }
- }
-
-Fixtures examples can be found within the Twig repository
-`tests/Twig/Fixtures`_ directory.
-
-Node Tests
-~~~~~~~~~~
-
-Testing the node visitors can be complex, so extend your test cases from
-``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository
-`tests/Twig/Node`_ directory.
-
-.. _`spl_autoload_register()`: http://www.php.net/spl_autoload_register
-.. _`rot13`: http://www.php.net/manual/en/function.str-rot13.php
-.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures
-.. _`tests/Twig/Node`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node
diff --git a/plugins/twig/vendor/twig/twig/doc/api.rst b/plugins/twig/vendor/twig/twig/doc/api.rst
deleted file mode 100644
index f367db07..00000000
--- a/plugins/twig/vendor/twig/twig/doc/api.rst
+++ /dev/null
@@ -1,552 +0,0 @@
-Twig for Developers
-===================
-
-This chapter describes the API to Twig and not the template language. It will
-be most useful as reference to those implementing the template interface to
-the application and not those who are creating Twig templates.
-
-Basics
-------
-
-Twig uses a central object called the **environment** (of class
-``Twig_Environment``). Instances of this class are used to store the
-configuration and extensions, and are used to load templates from the file
-system or other locations.
-
-Most applications will create one ``Twig_Environment`` object on application
-initialization and use that to load templates. In some cases it's however
-useful to have multiple environments side by side, if different configurations
-are in use.
-
-The simplest way to configure Twig to load templates for your application
-looks roughly like this::
-
- require_once '/path/to/lib/Twig/Autoloader.php';
- Twig_Autoloader::register();
-
- $loader = new Twig_Loader_Filesystem('/path/to/templates');
- $twig = new Twig_Environment($loader, array(
- 'cache' => '/path/to/compilation_cache',
- ));
-
-This will create a template environment with the default settings and a loader
-that looks up the templates in the ``/path/to/templates/`` folder. Different
-loaders are available and you can also write your own if you want to load
-templates from a database or other resources.
-
-.. note::
-
- Notice that the second argument of the environment is an array of options.
- The ``cache`` option is a compilation cache directory, where Twig caches
- the compiled templates to avoid the parsing phase for sub-sequent
- requests. It is very different from the cache you might want to add for
- the evaluated templates. For such a need, you can use any available PHP
- cache library.
-
-To load a template from this environment you just have to call the
-``loadTemplate()`` method which then returns a ``Twig_Template`` instance::
-
- $template = $twig->loadTemplate('index.html');
-
-To render the template with some variables, call the ``render()`` method::
-
- echo $template->render(array('the' => 'variables', 'go' => 'here'));
-
-.. note::
-
- The ``display()`` method is a shortcut to output the template directly.
-
-You can also load and render the template in one fell swoop::
-
- echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here'));
-
-.. _environment_options:
-
-Environment Options
--------------------
-
-When creating a new ``Twig_Environment`` instance, you can pass an array of
-options as the constructor second argument::
-
- $twig = new Twig_Environment($loader, array('debug' => true));
-
-The following options are available:
-
-* ``debug`` *boolean*
-
- When set to ``true``, the generated templates have a
- ``__toString()`` method that you can use to display the generated nodes
- (default to ``false``).
-
-* ``charset`` *string (default to ``utf-8``)*
-
- The charset used by the templates.
-
-* ``base_template_class`` *string (default to ``Twig_Template``)*
-
- The base template class to use for generated
- templates.
-
-* ``cache`` *string|false*
-
- An absolute path where to store the compiled templates, or
- ``false`` to disable caching (which is the default).
-
-* ``auto_reload`` *boolean*
-
- When developing with Twig, it's useful to recompile the
- template whenever the source code changes. If you don't provide a value for
- the ``auto_reload`` option, it will be determined automatically based on the
- ``debug`` value.
-
-* ``strict_variables`` *boolean*
-
- If set to ``false``, Twig will silently ignore invalid
- variables (variables and or attributes/methods that do not exist) and
- replace them with a ``null`` value. When set to ``true``, Twig throws an
- exception instead (default to ``false``).
-
-* ``autoescape`` *string|boolean*
-
- If set to ``true``, HTML auto-escaping will be enabled by
- default for all templates (default to ``true``).
-
- As of Twig 1.8, you can set the escaping strategy to use (``html``, ``js``,
- ``false`` to disable).
-
- As of Twig 1.9, you can set the escaping strategy to use (``css``, ``url``,
- ``html_attr``, or a PHP callback that takes the template "filename" and must
- return the escaping strategy to use -- the callback cannot be a function name
- to avoid collision with built-in escaping strategies).
-
- As of Twig 1.17, the ``filename`` escaping strategy determines the escaping
- strategy to use for a template based on the template filename extension (this
- strategy does not incur any overhead at runtime as auto-escaping is done at
- compilation time.)
-
-* ``optimizations`` *integer*
-
- A flag that indicates which optimizations to apply
- (default to ``-1`` -- all optimizations are enabled; set it to ``0`` to
- disable).
-
-Loaders
--------
-
-Loaders are responsible for loading templates from a resource such as the file
-system.
-
-Compilation Cache
-~~~~~~~~~~~~~~~~~
-
-All template loaders can cache the compiled templates on the filesystem for
-future reuse. It speeds up Twig a lot as templates are only compiled once; and
-the performance boost is even larger if you use a PHP accelerator such as APC.
-See the ``cache`` and ``auto_reload`` options of ``Twig_Environment`` above
-for more information.
-
-Built-in Loaders
-~~~~~~~~~~~~~~~~
-
-Here is a list of the built-in loaders Twig provides:
-
-``Twig_Loader_Filesystem``
-..........................
-
-.. versionadded:: 1.10
- The ``prependPath()`` and support for namespaces were added in Twig 1.10.
-
-``Twig_Loader_Filesystem`` loads templates from the file system. This loader
-can find templates in folders on the file system and is the preferred way to
-load them::
-
- $loader = new Twig_Loader_Filesystem($templateDir);
-
-It can also look for templates in an array of directories::
-
- $loader = new Twig_Loader_Filesystem(array($templateDir1, $templateDir2));
-
-With such a configuration, Twig will first look for templates in
-``$templateDir1`` and if they do not exist, it will fallback to look for them
-in the ``$templateDir2``.
-
-You can add or prepend paths via the ``addPath()`` and ``prependPath()``
-methods::
-
- $loader->addPath($templateDir3);
- $loader->prependPath($templateDir4);
-
-The filesystem loader also supports namespaced templates. This allows to group
-your templates under different namespaces which have their own template paths.
-
-When using the ``setPaths()``, ``addPath()``, and ``prependPath()`` methods,
-specify the namespace as the second argument (when not specified, these
-methods act on the "main" namespace)::
-
- $loader->addPath($templateDir, 'admin');
-
-Namespaced templates can be accessed via the special
-``@namespace_name/template_path`` notation::
-
- $twig->render('@admin/index.html', array());
-
-``Twig_Loader_Array``
-.....................
-
-``Twig_Loader_Array`` loads a template from a PHP array. It's passed an array
-of strings bound to template names::
-
- $loader = new Twig_Loader_Array(array(
- 'index.html' => 'Hello {{ name }}!',
- ));
- $twig = new Twig_Environment($loader);
-
- echo $twig->render('index.html', array('name' => 'Fabien'));
-
-This loader is very useful for unit testing. It can also be used for small
-projects where storing all templates in a single PHP file might make sense.
-
-.. tip::
-
- When using the ``Array`` or ``String`` loaders with a cache mechanism, you
- should know that a new cache key is generated each time a template content
- "changes" (the cache key being the source code of the template). If you
- don't want to see your cache grows out of control, you need to take care
- of clearing the old cache file by yourself.
-
-``Twig_Loader_Chain``
-.....................
-
-``Twig_Loader_Chain`` delegates the loading of templates to other loaders::
-
- $loader1 = new Twig_Loader_Array(array(
- 'base.html' => '{% block content %}{% endblock %}',
- ));
- $loader2 = new Twig_Loader_Array(array(
- 'index.html' => '{% extends "base.html" %}{% block content %}Hello {{ name }}{% endblock %}',
- 'base.html' => 'Will never be loaded',
- ));
-
- $loader = new Twig_Loader_Chain(array($loader1, $loader2));
-
- $twig = new Twig_Environment($loader);
-
-When looking for a template, Twig will try each loader in turn and it will
-return as soon as the template is found. When rendering the ``index.html``
-template from the above example, Twig will load it with ``$loader2`` but the
-``base.html`` template will be loaded from ``$loader1``.
-
-``Twig_Loader_Chain`` accepts any loader that implements
-``Twig_LoaderInterface``.
-
-.. note::
-
- You can also add loaders via the ``addLoader()`` method.
-
-Create your own Loader
-~~~~~~~~~~~~~~~~~~~~~~
-
-All loaders implement the ``Twig_LoaderInterface``::
-
- interface Twig_LoaderInterface
- {
- /**
- * Gets the source code of a template, given its name.
- *
- * @param string $name string The name of the template to load
- *
- * @return string The template source code
- */
- function getSource($name);
-
- /**
- * Gets the cache key to use for the cache for a given template name.
- *
- * @param string $name string The name of the template to load
- *
- * @return string The cache key
- */
- function getCacheKey($name);
-
- /**
- * Returns true if the template is still fresh.
- *
- * @param string $name The template name
- * @param timestamp $time The last modification time of the cached template
- */
- function isFresh($name, $time);
- }
-
-The ``isFresh()`` method must return ``true`` if the current cached template
-is still fresh, given the last modification time, or ``false`` otherwise.
-
-.. tip::
-
- As of Twig 1.11.0, you can also implement ``Twig_ExistsLoaderInterface``
- to make your loader faster when used with the chain loader.
-
-Using Extensions
-----------------
-
-Twig extensions are packages that add new features to Twig. Using an
-extension is as simple as using the ``addExtension()`` method::
-
- $twig->addExtension(new Twig_Extension_Sandbox());
-
-Twig comes bundled with the following extensions:
-
-* *Twig_Extension_Core*: Defines all the core features of Twig.
-
-* *Twig_Extension_Escaper*: Adds automatic output-escaping and the possibility
- to escape/unescape blocks of code.
-
-* *Twig_Extension_Sandbox*: Adds a sandbox mode to the default Twig
- environment, making it safe to evaluate untrusted code.
-
-* *Twig_Extension_Profiler*: Enabled the built-in Twig profiler (as of Twig
- 1.18).
-
-* *Twig_Extension_Optimizer*: Optimizes the node tree before compilation.
-
-The core, escaper, and optimizer extensions do not need to be added to the
-Twig environment, as they are registered by default.
-
-Built-in Extensions
--------------------
-
-This section describes the features added by the built-in extensions.
-
-.. tip::
-
- Read the chapter about extending Twig to learn how to create your own
- extensions.
-
-Core Extension
-~~~~~~~~~~~~~~
-
-The ``core`` extension defines all the core features of Twig:
-
-* :doc:`Tags `;
-* :doc:`Filters `;
-* :doc:`Functions `;
-* :doc:`Tests `.
-
-Escaper Extension
-~~~~~~~~~~~~~~~~~
-
-The ``escaper`` extension adds automatic output escaping to Twig. It defines a
-tag, ``autoescape``, and a filter, ``raw``.
-
-When creating the escaper extension, you can switch on or off the global
-output escaping strategy::
-
- $escaper = new Twig_Extension_Escaper('html');
- $twig->addExtension($escaper);
-
-If set to ``html``, all variables in templates are escaped (using the ``html``
-escaping strategy), except those using the ``raw`` filter:
-
-.. code-block:: jinja
-
- {{ article.to_html|raw }}
-
-You can also change the escaping mode locally by using the ``autoescape`` tag
-(see the :doc:`autoescape` doc for the syntax used before
-Twig 1.8):
-
-.. code-block:: jinja
-
- {% autoescape 'html' %}
- {{ var }}
- {{ var|raw }} {# var won't be escaped #}
- {{ var|escape }} {# var won't be double-escaped #}
- {% endautoescape %}
-
-.. warning::
-
- The ``autoescape`` tag has no effect on included files.
-
-The escaping rules are implemented as follows:
-
-* Literals (integers, booleans, arrays, ...) used in the template directly as
- variables or filter arguments are never automatically escaped:
-
- .. code-block:: jinja
-
- {{ "Twig " }} {# won't be escaped #}
-
- {% set text = "Twig " %}
- {{ text }} {# will be escaped #}
-
-* Expressions which the result is always a literal or a variable marked safe
- are never automatically escaped:
-
- .. code-block:: jinja
-
- {{ foo ? "Twig " : " Twig" }} {# won't be escaped #}
-
- {% set text = "Twig " %}
- {{ foo ? text : " Twig" }} {# will be escaped #}
-
- {% set text = "Twig " %}
- {{ foo ? text|raw : " Twig" }} {# won't be escaped #}
-
- {% set text = "Twig " %}
- {{ foo ? text|escape : " Twig" }} {# the result of the expression won't be escaped #}
-
-* Escaping is applied before printing, after any other filter is applied:
-
- .. code-block:: jinja
-
- {{ var|upper }} {# is equivalent to {{ var|upper|escape }} #}
-
-* The `raw` filter should only be used at the end of the filter chain:
-
- .. code-block:: jinja
-
- {{ var|raw|upper }} {# will be escaped #}
-
- {{ var|upper|raw }} {# won't be escaped #}
-
-* Automatic escaping is not applied if the last filter in the chain is marked
- safe for the current context (e.g. ``html`` or ``js``). ``escape`` and
- ``escape('html')`` are marked safe for HTML, ``escape('js')`` is marked
- safe for JavaScript, ``raw`` is marked safe for everything.
-
- .. code-block:: jinja
-
- {% autoescape 'js' %}
- {{ var|escape('html') }} {# will be escaped for HTML and JavaScript #}
- {{ var }} {# will be escaped for JavaScript #}
- {{ var|escape('js') }} {# won't be double-escaped #}
- {% endautoescape %}
-
-.. note::
-
- Note that autoescaping has some limitations as escaping is applied on
- expressions after evaluation. For instance, when working with
- concatenation, ``{{ foo|raw ~ bar }}`` won't give the expected result as
- escaping is applied on the result of the concatenation, not on the
- individual variables (so, the ``raw`` filter won't have any effect here).
-
-Sandbox Extension
-~~~~~~~~~~~~~~~~~
-
-The ``sandbox`` extension can be used to evaluate untrusted code. Access to
-unsafe attributes and methods is prohibited. The sandbox security is managed
-by a policy instance. By default, Twig comes with one policy class:
-``Twig_Sandbox_SecurityPolicy``. This class allows you to white-list some
-tags, filters, properties, and methods::
-
- $tags = array('if');
- $filters = array('upper');
- $methods = array(
- 'Article' => array('getTitle', 'getBody'),
- );
- $properties = array(
- 'Article' => array('title', 'body'),
- );
- $functions = array('range');
- $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
-
-With the previous configuration, the security policy will only allow usage of
-the ``if`` tag, and the ``upper`` filter. Moreover, the templates will only be
-able to call the ``getTitle()`` and ``getBody()`` methods on ``Article``
-objects, and the ``title`` and ``body`` public properties. Everything else
-won't be allowed and will generate a ``Twig_Sandbox_SecurityError`` exception.
-
-The policy object is the first argument of the sandbox constructor::
-
- $sandbox = new Twig_Extension_Sandbox($policy);
- $twig->addExtension($sandbox);
-
-By default, the sandbox mode is disabled and should be enabled when including
-untrusted template code by using the ``sandbox`` tag:
-
-.. code-block:: jinja
-
- {% sandbox %}
- {% include 'user.html' %}
- {% endsandbox %}
-
-You can sandbox all templates by passing ``true`` as the second argument of
-the extension constructor::
-
- $sandbox = new Twig_Extension_Sandbox($policy, true);
-
-Profiler Extension
-~~~~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.18
- The Profile extension was added in Twig 1.18.
-
-The ``profiler`` extension enables a profiler for Twig templates; it should
-only be used on your development machines as it adds some overhead::
-
- $profile = new Twig_Profiler_Profile();
- $twig->addExtension(new Twig_Extension_Profiler($profile));
-
- $dumper = new Twig_Profiler_Dumper_Text();
- echo $dumper->dump($profile);
-
-A profile contains information about time and memory consumption for template,
-block, and macro executions.
-
-You can also dump the data in a `Blackfire.io `_
-compatible format::
-
- $dumper = new Twig_Profiler_Dumper_Blackfire();
- file_put_contents('/path/to/profile.prof', $dumper->dump($profile));
-
-Upload the profile to visualize it (create a `free account
-`_ first):
-
-.. code-block:: sh
-
- blackfire --slot=7 upload /path/to/profile.prof
-
-Optimizer Extension
-~~~~~~~~~~~~~~~~~~~
-
-The ``optimizer`` extension optimizes the node tree before compilation::
-
- $twig->addExtension(new Twig_Extension_Optimizer());
-
-By default, all optimizations are turned on. You can select the ones you want
-to enable by passing them to the constructor::
-
- $optimizer = new Twig_Extension_Optimizer(Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR);
-
- $twig->addExtension($optimizer);
-
-Twig supports the following optimizations:
-
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_ALL``, enables all optimizations
- (this is the default value).
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_NONE``, disables all optimizations.
- This reduces the compilation time, but it can increase the execution time
- and the consumed memory.
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR``, optimizes the ``for`` tag by
- removing the ``loop`` variable creation whenever possible.
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_RAW_FILTER``, removes the ``raw``
- filter whenever possible.
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_VAR_ACCESS``, simplifies the creation
- and access of variables in the compiled templates whenever possible.
-
-Exceptions
-----------
-
-Twig can throw exceptions:
-
-* ``Twig_Error``: The base exception for all errors.
-
-* ``Twig_Error_Syntax``: Thrown to tell the user that there is a problem with
- the template syntax.
-
-* ``Twig_Error_Runtime``: Thrown when an error occurs at runtime (when a filter
- does not exist for instance).
-
-* ``Twig_Error_Loader``: Thrown when an error occurs during template loading.
-
-* ``Twig_Sandbox_SecurityError``: Thrown when an unallowed tag, filter, or
- method is called in a sandboxed template.
diff --git a/plugins/twig/vendor/twig/twig/doc/coding_standards.rst b/plugins/twig/vendor/twig/twig/doc/coding_standards.rst
deleted file mode 100644
index f435df49..00000000
--- a/plugins/twig/vendor/twig/twig/doc/coding_standards.rst
+++ /dev/null
@@ -1,101 +0,0 @@
-Coding Standards
-================
-
-When writing Twig templates, we recommend you to follow these official coding
-standards:
-
-* Put one (and only one) space after the start of a delimiter (``{{``, ``{%``,
- and ``{#``) and before the end of a delimiter (``}}``, ``%}``, and ``#}``):
-
- .. code-block:: jinja
-
- {{ foo }}
- {# comment #}
- {% if foo %}{% endif %}
-
- When using the whitespace control character, do not put any spaces between
- it and the delimiter:
-
- .. code-block:: jinja
-
- {{- foo -}}
- {#- comment -#}
- {%- if foo -%}{%- endif -%}
-
-* Put one (and only one) space before and after the following operators:
- comparison operators (``==``, ``!=``, ``<``, ``>``, ``>=``, ``<=``), math
- operators (``+``, ``-``, ``/``, ``*``, ``%``, ``//``, ``**``), logic
- operators (``not``, ``and``, ``or``), ``~``, ``is``, ``in``, and the ternary
- operator (``?:``):
-
- .. code-block:: jinja
-
- {{ 1 + 2 }}
- {{ foo ~ bar }}
- {{ true ? true : false }}
-
-* Put one (and only one) space after the ``:`` sign in hashes and ``,`` in
- arrays and hashes:
-
- .. code-block:: jinja
-
- {{ [1, 2, 3] }}
- {{ {'foo': 'bar'} }}
-
-* Do not put any spaces after an opening parenthesis and before a closing
- parenthesis in expressions:
-
- .. code-block:: jinja
-
- {{ 1 + (2 * 3) }}
-
-* Do not put any spaces before and after string delimiters:
-
- .. code-block:: jinja
-
- {{ 'foo' }}
- {{ "foo" }}
-
-* Do not put any spaces before and after the following operators: ``|``,
- ``.``, ``..``, ``[]``:
-
- .. code-block:: jinja
-
- {{ foo|upper|lower }}
- {{ user.name }}
- {{ user[name] }}
- {% for i in 1..12 %}{% endfor %}
-
-* Do not put any spaces before and after the parenthesis used for filter and
- function calls:
-
- .. code-block:: jinja
-
- {{ foo|default('foo') }}
- {{ range(1..10) }}
-
-* Do not put any spaces before and after the opening and the closing of arrays
- and hashes:
-
- .. code-block:: jinja
-
- {{ [1, 2, 3] }}
- {{ {'foo': 'bar'} }}
-
-* Use lower cased and underscored variable names:
-
- .. code-block:: jinja
-
- {% set foo = 'foo' %}
- {% set foo_bar = 'foo' %}
-
-* Indent your code inside tags (use the same indentation as the one used for
- the target language of the rendered template):
-
- .. code-block:: jinja
-
- {% block foo %}
- {% if true %}
- true
- {% endif %}
- {% endblock %}
diff --git a/plugins/twig/vendor/twig/twig/doc/deprecated.rst b/plugins/twig/vendor/twig/twig/doc/deprecated.rst
deleted file mode 100644
index d31f1dd3..00000000
--- a/plugins/twig/vendor/twig/twig/doc/deprecated.rst
+++ /dev/null
@@ -1,162 +0,0 @@
-Deprecated Features
-===================
-
-This document lists all deprecated features in Twig. Deprecated features are
-kept for backward compatibility and removed in the next major release (a
-feature that was deprecated in Twig 1.x is removed in Twig 2.0).
-
-Deprecation Notices
--------------------
-
-As of Twig 1.21, Twig generates deprecation notices when a template uses
-deprecated features. See :ref:`deprecation-notices` for more information.
-
-Token Parsers
--------------
-
-* As of Twig 1.x, the token parser broker sub-system is deprecated. The
- following class and interface will be removed in 2.0:
-
- * ``Twig_TokenParserBrokerInterface``
- * ``Twig_TokenParserBroker``
-
-Extensions
-----------
-
-* As of Twig 1.x, the ability to remove an extension is deprecated and the
- ``Twig_Environment::removeExtension()`` method will be removed in 2.0.
-
-* As of Twig 1.23, the ``Twig_ExtensionInterface::initRuntime()`` method is
- deprecated. You have two options to avoid the deprecation notice: if you
- implement this method to store the environment for your custom filters,
- functions, or tests, use the ``needs_environment`` option instead; if you
- have more complex needs, explicitly implement
- ``Twig_Extension_InitRuntimeInterface`` (not recommended).
-
-* As of Twig 1.23, the ``Twig_ExtensionInterface::getGlobals()`` method is
- deprecated. Implement ``Twig_Extension_GlobalsInterface`` to avoid
- deprecation notices.
-
-PEAR
-----
-
-PEAR support has been discontinued in Twig 1.15.1, and no PEAR packages are
-provided anymore. Use Composer instead.
-
-Filters
--------
-
-* As of Twig 1.x, use ``Twig_SimpleFilter`` to add a filter. The following
- classes and interfaces will be removed in 2.0:
-
- * ``Twig_FilterInterface``
- * ``Twig_FilterCallableInterface``
- * ``Twig_Filter``
- * ``Twig_Filter_Function``
- * ``Twig_Filter_Method``
- * ``Twig_Filter_Node``
-
-* As of Twig 2.x, the ``Twig_SimpleFilter`` class is deprecated and will be
- removed in Twig 3.x (use ``Twig_Filter`` instead). In Twig 2.x,
- ``Twig_SimpleFilter`` is just an alias for ``Twig_Filter``.
-
-Functions
----------
-
-* As of Twig 1.x, use ``Twig_SimpleFunction`` to add a function. The following
- classes and interfaces will be removed in 2.0:
-
- * ``Twig_FunctionInterface``
- * ``Twig_FunctionCallableInterface``
- * ``Twig_Function``
- * ``Twig_Function_Function``
- * ``Twig_Function_Method``
- * ``Twig_Function_Node``
-
-* As of Twig 2.x, the ``Twig_SimpleFunction`` class is deprecated and will be
- removed in Twig 3.x (use ``Twig_Function`` instead). In Twig 2.x,
- ``Twig_SimpleFunction`` is just an alias for ``Twig_Function``.
-
-Tests
------
-
-* As of Twig 1.x, use ``Twig_SimpleTest`` to add a test. The following classes
- and interfaces will be removed in 2.0:
-
- * ``Twig_TestInterface``
- * ``Twig_TestCallableInterface``
- * ``Twig_Test``
- * ``Twig_Test_Function``
- * ``Twig_Test_Method``
- * ``Twig_Test_Node``
-
-* As of Twig 2.x, the ``Twig_SimpleTest`` class is deprecated and will be
- removed in Twig 3.x (use ``Twig_Test`` instead). In Twig 2.x,
- ``Twig_SimpleTest`` is just an alias for ``Twig_Test``.
-
-* The ``sameas`` and ``divisibleby`` tests are deprecated in favor of ``same
- as`` and ``divisible by`` respectively.
-
-Tags
-----
-
-* As of Twig 1.x, the ``raw`` tag is deprecated. You should use ``verbatim``
- instead.
-
-Nodes
------
-
-* As of Twig 1.x, ``Node::toXml()`` is deprecated and will be removed in Twig
- 2.0.
-
-Interfaces
-----------
-
-* As of Twig 2.x, the following interfaces are deprecated and empty (they will
- be removed in Twig 3.0):
-
-* ``Twig_CompilerInterface`` (use ``Twig_Compiler`` instead)
-* ``Twig_LexerInterface`` (use ``Twig_Lexer`` instead)
-* ``Twig_NodeInterface`` (use ``Twig_Node`` instead)
-* ``Twig_ParserInterface`` (use ``Twig_Parser`` instead)
-* ``Twig_ExistsLoaderInterface`` (merged with ``Twig_LoaderInterface``)
-* ``Twig_TemplateInterface`` (use ``Twig_Template`` instead, and use
- those constants Twig_Template::ANY_CALL, Twig_Template::ARRAY_CALL,
- Twig_Template::METHOD_CALL)
-
-Loaders
--------
-
-* As of Twig 1.x, ``Twig_Loader_String`` is deprecated and will be removed in
- 2.0. You can render a string via ``Twig_Environment::createTemplate()``.
-
-Node Visitors
--------------
-
-* Because of the removal of ``Twig_NodeInterface`` in 2.0, you need to extend
- ``Twig_BaseNodeVisitor`` instead of implementing ``Twig_NodeVisitorInterface``
- directly to make your node visitors compatible with both Twig 1.x and 2.x.
-
-Globals
--------
-
-* As of Twig 2.x, the ability to register a global variable after the runtime
- or the extensions have been initialized is not possible anymore (but
- changing the value of an already registered global is possible).
-
-* As of Twig 1.x, using the ``_self`` global variable to get access to the
- current ``Twig_Template`` instance is deprecated; most usages only need the
- current template name, which will continue to work in Twig 2.0. In Twig 2.0,
- ``_self`` returns the current template name instead of the current
- ``Twig_Template`` instance.
-
-Miscellaneous
--------------
-
-* As of Twig 1.x, ``Twig_Environment::clearTemplateCache()``, ``Twig_Environment::writeCacheFile()``,
- ``Twig_Environment::clearCacheFiles()``, ``Twig_Environment::getCacheFilename()``, and
- ``Twig_Environment::getTemplateClassPrefix()`` are deprecated and will be removed in 2.0.
-
-* As of Twig 1.x, ``Twig_Template::getEnvironment()`` and
- ``Twig_TemplateInterface::getEnvironment()`` are deprecated and will be
- removed in 2.0.
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/abs.rst b/plugins/twig/vendor/twig/twig/doc/filters/abs.rst
deleted file mode 100644
index 22fa59d0..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/abs.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-``abs``
-=======
-
-The ``abs`` filter returns the absolute value.
-
-.. code-block:: jinja
-
- {# number = -5 #}
-
- {{ number|abs }}
-
- {# outputs 5 #}
-
-.. note::
-
- Internally, Twig uses the PHP `abs`_ function.
-
-.. _`abs`: http://php.net/abs
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/batch.rst b/plugins/twig/vendor/twig/twig/doc/filters/batch.rst
deleted file mode 100644
index f8b6fa9d..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/batch.rst
+++ /dev/null
@@ -1,51 +0,0 @@
-``batch``
-=========
-
-.. versionadded:: 1.12.3
- The ``batch`` filter was added in Twig 1.12.3.
-
-The ``batch`` filter "batches" items by returning a list of lists with the
-given number of items. A second parameter can be provided and used to fill in
-missing items:
-
-.. code-block:: jinja
-
- {% set items = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] %}
-
-
- {% for row in items|batch(3, 'No item') %}
-
- {% for column in row %}
-
{{ column }}
- {% endfor %}
-
- {% endfor %}
-
-
-The above example will be rendered as:
-
-.. code-block:: jinja
-
-
-
-
a
-
b
-
c
-
-
-
d
-
e
-
f
-
-
-
g
-
No item
-
No item
-
-
-
-Arguments
----------
-
-* ``size``: The size of the batch; fractional numbers will be rounded up
-* ``fill``: Used to fill in missing items
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst b/plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst
deleted file mode 100644
index 10546a1f..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/capitalize.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-``capitalize``
-==============
-
-The ``capitalize`` filter capitalizes a value. The first character will be
-uppercase, all others lowercase:
-
-.. code-block:: jinja
-
- {{ 'my first car'|capitalize }}
-
- {# outputs 'My first car' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst b/plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst
deleted file mode 100644
index f4ebe580..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/convert_encoding.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-``convert_encoding``
-====================
-
-.. versionadded:: 1.4
- The ``convert_encoding`` filter was added in Twig 1.4.
-
-The ``convert_encoding`` filter converts a string from one encoding to
-another. The first argument is the expected output charset and the second one
-is the input charset:
-
-.. code-block:: jinja
-
- {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }}
-
-.. note::
-
- This filter relies on the `iconv`_ or `mbstring`_ extension, so one of
- them must be installed. In case both are installed, `mbstring`_ is used by
- default (Twig before 1.8.1 uses `iconv`_ by default).
-
-Arguments
----------
-
-* ``to``: The output charset
-* ``from``: The input charset
-
-.. _`iconv`: http://php.net/iconv
-.. _`mbstring`: http://php.net/mbstring
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/date.rst b/plugins/twig/vendor/twig/twig/doc/filters/date.rst
deleted file mode 100644
index c86d42ba..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/date.rst
+++ /dev/null
@@ -1,94 +0,0 @@
-``date``
-========
-
-.. versionadded:: 1.1
- The timezone support has been added in Twig 1.1.
-
-.. versionadded:: 1.5
- The default date format support has been added in Twig 1.5.
-
-.. versionadded:: 1.6.1
- The default timezone support has been added in Twig 1.6.1.
-
-.. versionadded:: 1.11.0
- The introduction of the false value for the timezone was introduced in Twig 1.11.0
-
-The ``date`` filter formats a date to a given format:
-
-.. code-block:: jinja
-
- {{ post.published_at|date("m/d/Y") }}
-
-The format specifier is the same as supported by `date`_,
-except when the filtered data is of type `DateInterval`_, when the format must conform to
-`DateInterval::format`_ instead.
-
-The ``date`` filter accepts strings (it must be in a format supported by the
-`strtotime`_ function), `DateTime`_ instances, or `DateInterval`_ instances. For
-instance, to display the current date, filter the word "now":
-
-.. code-block:: jinja
-
- {{ "now"|date("m/d/Y") }}
-
-To escape words and characters in the date format use ``\\`` in front of each
-character:
-
-.. code-block:: jinja
-
- {{ post.published_at|date("F jS \\a\\t g:ia") }}
-
-If the value passed to the ``date`` filter is ``null``, it will return the
-current date by default. If an empty string is desired instead of the current
-date, use a ternary operator:
-
-.. code-block:: jinja
-
- {{ post.published_at is empty ? "" : post.published_at|date("m/d/Y") }}
-
-If no format is provided, Twig will use the default one: ``F j, Y H:i``. This
-default can be easily changed by calling the ``setDateFormat()`` method on the
-``core`` extension instance. The first argument is the default format for
-dates and the second one is the default format for date intervals:
-
-.. code-block:: php
-
- $twig = new Twig_Environment($loader);
- $twig->getExtension('core')->setDateFormat('d/m/Y', '%d days');
-
-Timezone
---------
-
-By default, the date is displayed by applying the default timezone (the one
-specified in php.ini or declared in Twig -- see below), but you can override
-it by explicitly specifying a timezone:
-
-.. code-block:: jinja
-
- {{ post.published_at|date("m/d/Y", "Europe/Paris") }}
-
-If the date is already a DateTime object, and if you want to keep its current
-timezone, pass ``false`` as the timezone value:
-
-.. code-block:: jinja
-
- {{ post.published_at|date("m/d/Y", false) }}
-
-The default timezone can also be set globally by calling ``setTimezone()``:
-
-.. code-block:: php
-
- $twig = new Twig_Environment($loader);
- $twig->getExtension('core')->setTimezone('Europe/Paris');
-
-Arguments
----------
-
-* ``format``: The date format
-* ``timezone``: The date timezone
-
-.. _`strtotime`: http://www.php.net/strtotime
-.. _`DateTime`: http://www.php.net/DateTime
-.. _`DateInterval`: http://www.php.net/DateInterval
-.. _`date`: http://www.php.net/date
-.. _`DateInterval::format`: http://www.php.net/DateInterval.format
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst b/plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst
deleted file mode 100644
index add40b56..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/date_modify.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-``date_modify``
-===============
-
-.. versionadded:: 1.9.0
- The date_modify filter has been added in Twig 1.9.0.
-
-The ``date_modify`` filter modifies a date with a given modifier string:
-
-.. code-block:: jinja
-
- {{ post.published_at|date_modify("+1 day")|date("m/d/Y") }}
-
-The ``date_modify`` filter accepts strings (it must be in a format supported
-by the `strtotime`_ function) or `DateTime`_ instances. You can easily combine
-it with the :doc:`date` filter for formatting.
-
-Arguments
----------
-
-* ``modifier``: The modifier
-
-.. _`strtotime`: http://www.php.net/strtotime
-.. _`DateTime`: http://www.php.net/DateTime
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/default.rst b/plugins/twig/vendor/twig/twig/doc/filters/default.rst
deleted file mode 100644
index 641ac6e7..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/default.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-``default``
-===========
-
-The ``default`` filter returns the passed default value if the value is
-undefined or empty, otherwise the value of the variable:
-
-.. code-block:: jinja
-
- {{ var|default('var is not defined') }}
-
- {{ var.foo|default('foo item on var is not defined') }}
-
- {{ var['foo']|default('foo item on var is not defined') }}
-
- {{ ''|default('passed var is empty') }}
-
-When using the ``default`` filter on an expression that uses variables in some
-method calls, be sure to use the ``default`` filter whenever a variable can be
-undefined:
-
-.. code-block:: jinja
-
- {{ var.method(foo|default('foo'))|default('foo') }}
-
-.. note::
-
- Read the documentation for the :doc:`defined<../tests/defined>` and
- :doc:`empty<../tests/empty>` tests to learn more about their semantics.
-
-Arguments
----------
-
-* ``default``: The default value
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/escape.rst b/plugins/twig/vendor/twig/twig/doc/filters/escape.rst
deleted file mode 100644
index fc9771ac..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/escape.rst
+++ /dev/null
@@ -1,116 +0,0 @@
-``escape``
-==========
-
-.. versionadded:: 1.9.0
- The ``css``, ``url``, and ``html_attr`` strategies were added in Twig
- 1.9.0.
-
-.. versionadded:: 1.14.0
- The ability to define custom escapers was added in Twig 1.14.0.
-
-The ``escape`` filter escapes a string for safe insertion into the final
-output. It supports different escaping strategies depending on the template
-context.
-
-By default, it uses the HTML escaping strategy:
-
-.. code-block:: jinja
-
- {{ user.username|escape }}
-
-For convenience, the ``e`` filter is defined as an alias:
-
-.. code-block:: jinja
-
- {{ user.username|e }}
-
-The ``escape`` filter can also be used in other contexts than HTML thanks to
-an optional argument which defines the escaping strategy to use:
-
-.. code-block:: jinja
-
- {{ user.username|e }}
- {# is equivalent to #}
- {{ user.username|e('html') }}
-
-And here is how to escape variables included in JavaScript code:
-
-.. code-block:: jinja
-
- {{ user.username|escape('js') }}
- {{ user.username|e('js') }}
-
-The ``escape`` filter supports the following escaping strategies:
-
-* ``html``: escapes a string for the **HTML body** context.
-
-* ``js``: escapes a string for the **JavaScript context**.
-
-* ``css``: escapes a string for the **CSS context**. CSS escaping can be
- applied to any string being inserted into CSS and escapes everything except
- alphanumerics.
-
-* ``url``: escapes a string for the **URI or parameter contexts**. This should
- not be used to escape an entire URI; only a subcomponent being inserted.
-
-* ``html_attr``: escapes a string for the **HTML attribute** context.
-
-.. note::
-
- Internally, ``escape`` uses the PHP native `htmlspecialchars`_ function
- for the HTML escaping strategy.
-
-.. caution::
-
- When using automatic escaping, Twig tries to not double-escape a variable
- when the automatic escaping strategy is the same as the one applied by the
- escape filter; but that does not work when using a variable as the
- escaping strategy:
-
- .. code-block:: jinja
-
- {% set strategy = 'html' %}
-
- {% autoescape 'html' %}
- {{ var|escape('html') }} {# won't be double-escaped #}
- {{ var|escape(strategy) }} {# will be double-escaped #}
- {% endautoescape %}
-
- When using a variable as the escaping strategy, you should disable
- automatic escaping:
-
- .. code-block:: jinja
-
- {% set strategy = 'html' %}
-
- {% autoescape 'html' %}
- {{ var|escape(strategy)|raw }} {# won't be double-escaped #}
- {% endautoescape %}
-
-Custom Escapers
----------------
-
-You can define custom escapers by calling the ``setEscaper()`` method on the
-``core`` extension instance. The first argument is the escaper name (to be
-used in the ``escape`` call) and the second one must be a valid PHP callable:
-
-.. code-block:: php
-
- $twig = new Twig_Environment($loader);
- $twig->getExtension('core')->setEscaper('csv', 'csv_escaper'));
-
-When called by Twig, the callable receives the Twig environment instance, the
-string to escape, and the charset.
-
-.. note::
-
- Built-in escapers cannot be overridden mainly they should be considered as
- the final implementation and also for better performance.
-
-Arguments
----------
-
-* ``strategy``: The escaping strategy
-* ``charset``: The string charset
-
-.. _`htmlspecialchars`: http://php.net/htmlspecialchars
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/first.rst b/plugins/twig/vendor/twig/twig/doc/filters/first.rst
deleted file mode 100644
index 674c1f9e..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/first.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-``first``
-=========
-
-.. versionadded:: 1.12.2
- The ``first`` filter was added in Twig 1.12.2.
-
-The ``first`` filter returns the first "element" of a sequence, a mapping, or
-a string:
-
-.. code-block:: jinja
-
- {{ [1, 2, 3, 4]|first }}
- {# outputs 1 #}
-
- {{ { a: 1, b: 2, c: 3, d: 4 }|first }}
- {# outputs 1 #}
-
- {{ '1234'|first }}
- {# outputs 1 #}
-
-.. note::
-
- It also works with objects implementing the `Traversable`_ interface.
-
-.. _`Traversable`: http://php.net/manual/en/class.traversable.php
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/format.rst b/plugins/twig/vendor/twig/twig/doc/filters/format.rst
deleted file mode 100644
index f8effd9a..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/format.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-``format``
-==========
-
-The ``format`` filter formats a given string by replacing the placeholders
-(placeholders follows the `sprintf`_ notation):
-
-.. code-block:: jinja
-
- {{ "I like %s and %s."|format(foo, "bar") }}
-
- {# outputs I like foo and bar
- if the foo parameter equals to the foo string. #}
-
-.. _`sprintf`: http://www.php.net/sprintf
-
-.. seealso:: :doc:`replace`
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/index.rst b/plugins/twig/vendor/twig/twig/doc/filters/index.rst
deleted file mode 100644
index 8daa9611..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/index.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-Filters
-=======
-
-.. toctree::
- :maxdepth: 1
-
- abs
- batch
- capitalize
- convert_encoding
- date
- date_modify
- default
- escape
- first
- format
- join
- json_encode
- keys
- last
- length
- lower
- merge
- nl2br
- number_format
- raw
- replace
- reverse
- round
- slice
- sort
- split
- striptags
- title
- trim
- upper
- url_encode
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/join.rst b/plugins/twig/vendor/twig/twig/doc/filters/join.rst
deleted file mode 100644
index 2fab9452..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/join.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-``join``
-========
-
-The ``join`` filter returns a string which is the concatenation of the items
-of a sequence:
-
-.. code-block:: jinja
-
- {{ [1, 2, 3]|join }}
- {# returns 123 #}
-
-The separator between elements is an empty string per default, but you can
-define it with the optional first parameter:
-
-.. code-block:: jinja
-
- {{ [1, 2, 3]|join('|') }}
- {# outputs 1|2|3 #}
-
-Arguments
----------
-
-* ``glue``: The separator
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst b/plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst
deleted file mode 100644
index a39bb476..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/json_encode.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-``json_encode``
-===============
-
-The ``json_encode`` filter returns the JSON representation of a value:
-
-.. code-block:: jinja
-
- {{ data|json_encode() }}
-
-.. note::
-
- Internally, Twig uses the PHP `json_encode`_ function.
-
-Arguments
----------
-
-* ``options``: A bitmask of `json_encode options`_ (``{{
- data|json_encode(constant('JSON_PRETTY_PRINT')) }}``)
-
-.. _`json_encode`: http://php.net/json_encode
-.. _`json_encode options`: http://www.php.net/manual/en/json.constants.php
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/keys.rst b/plugins/twig/vendor/twig/twig/doc/filters/keys.rst
deleted file mode 100644
index e4f090c6..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/keys.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-``keys``
-========
-
-The ``keys`` filter returns the keys of an array. It is useful when you want to
-iterate over the keys of an array:
-
-.. code-block:: jinja
-
- {% for key in array|keys %}
- ...
- {% endfor %}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/last.rst b/plugins/twig/vendor/twig/twig/doc/filters/last.rst
deleted file mode 100644
index 345b6573..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/last.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-``last``
-========
-
-.. versionadded:: 1.12.2
- The ``last`` filter was added in Twig 1.12.2.
-
-The ``last`` filter returns the last "element" of a sequence, a mapping, or
-a string:
-
-.. code-block:: jinja
-
- {{ [1, 2, 3, 4]|last }}
- {# outputs 4 #}
-
- {{ { a: 1, b: 2, c: 3, d: 4 }|last }}
- {# outputs 4 #}
-
- {{ '1234'|last }}
- {# outputs 4 #}
-
-.. note::
-
- It also works with objects implementing the `Traversable`_ interface.
-
-.. _`Traversable`: http://php.net/manual/en/class.traversable.php
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/length.rst b/plugins/twig/vendor/twig/twig/doc/filters/length.rst
deleted file mode 100644
index 1f783b3d..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/length.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-``length``
-==========
-
-The ``length`` filter returns the number of items of a sequence or mapping, or
-the length of a string:
-
-.. code-block:: jinja
-
- {% if users|length > 10 %}
- ...
- {% endif %}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/lower.rst b/plugins/twig/vendor/twig/twig/doc/filters/lower.rst
deleted file mode 100644
index ef9faa90..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/lower.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-``lower``
-=========
-
-The ``lower`` filter converts a value to lowercase:
-
-.. code-block:: jinja
-
- {{ 'WELCOME'|lower }}
-
- {# outputs 'welcome' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/merge.rst b/plugins/twig/vendor/twig/twig/doc/filters/merge.rst
deleted file mode 100644
index 88780dd6..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/merge.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-``merge``
-=========
-
-The ``merge`` filter merges an array with another array:
-
-.. code-block:: jinja
-
- {% set values = [1, 2] %}
-
- {% set values = values|merge(['apple', 'orange']) %}
-
- {# values now contains [1, 2, 'apple', 'orange'] #}
-
-New values are added at the end of the existing ones.
-
-The ``merge`` filter also works on hashes:
-
-.. code-block:: jinja
-
- {% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
-
- {% set items = items|merge({ 'peugeot': 'car', 'renault': 'car' }) %}
-
- {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car', 'renault': 'car' } #}
-
-For hashes, the merging process occurs on the keys: if the key does not
-already exist, it is added but if the key already exists, its value is
-overridden.
-
-.. tip::
-
- If you want to ensure that some values are defined in an array (by given
- default values), reverse the two elements in the call:
-
- .. code-block:: jinja
-
- {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
-
- {% set items = { 'apple': 'unknown' }|merge(items) %}
-
- {# items now contains { 'apple': 'fruit', 'orange': 'fruit' } #}
-
-.. note::
-
- Internally, Twig uses the PHP `array_merge`_ function. It supports
- Traversable objects by transforming those to arrays.
-
-.. _`array_merge`: http://php.net/array_merge
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst b/plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst
deleted file mode 100644
index 5c923e14..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/nl2br.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-``nl2br``
-=========
-
-.. versionadded:: 1.5
- The ``nl2br`` filter was added in Twig 1.5.
-
-The ``nl2br`` filter inserts HTML line breaks before all newlines in a string:
-
-.. code-block:: jinja
-
- {{ "I like Twig.\nYou will like it too."|nl2br }}
- {# outputs
-
- I like Twig.
- You will like it too.
-
- #}
-
-.. note::
-
- The ``nl2br`` filter pre-escapes the input before applying the
- transformation.
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/number_format.rst b/plugins/twig/vendor/twig/twig/doc/filters/number_format.rst
deleted file mode 100644
index 3114e845..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/number_format.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-``number_format``
-=================
-
-.. versionadded:: 1.5
- The ``number_format`` filter was added in Twig 1.5
-
-The ``number_format`` filter formats numbers. It is a wrapper around PHP's
-`number_format`_ function:
-
-.. code-block:: jinja
-
- {{ 200.35|number_format }}
-
-You can control the number of decimal places, decimal point, and thousands
-separator using the additional arguments:
-
-.. code-block:: jinja
-
- {{ 9800.333|number_format(2, '.', ',') }}
-
-If no formatting options are provided then Twig will use the default formatting
-options of:
-
-* 0 decimal places.
-* ``.`` as the decimal point.
-* ``,`` as the thousands separator.
-
-These defaults can be easily changed through the core extension:
-
-.. code-block:: php
-
- $twig = new Twig_Environment($loader);
- $twig->getExtension('core')->setNumberFormat(3, '.', ',');
-
-The defaults set for ``number_format`` can be over-ridden upon each call using the
-additional parameters.
-
-Arguments
----------
-
-* ``decimal``: The number of decimal points to display
-* ``decimal_point``: The character(s) to use for the decimal point
-* ``thousand_sep``: The character(s) to use for the thousands separator
-
-.. _`number_format`: http://php.net/number_format
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/raw.rst b/plugins/twig/vendor/twig/twig/doc/filters/raw.rst
deleted file mode 100644
index e5e5b12e..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/raw.rst
+++ /dev/null
@@ -1,36 +0,0 @@
-``raw``
-=======
-
-The ``raw`` filter marks the value as being "safe", which means that in an
-environment with automatic escaping enabled this variable will not be escaped
-if ``raw`` is the last filter applied to it:
-
-.. code-block:: jinja
-
- {% autoescape %}
- {{ var|raw }} {# var won't be escaped #}
- {% endautoescape %}
-
-.. note::
-
- Be careful when using the ``raw`` filter inside expressions:
-
- .. code-block:: jinja
-
- {% autoescape %}
- {% set hello = 'Hello' %}
- {% set hola = 'Hola' %}
-
- {{ false ? 'Hola' : hello|raw }}
- does not render the same as
- {{ false ? hola : hello|raw }}
- but renders the same as
- {{ (false ? hola : hello)|raw }}
- {% endautoescape %}
-
- The first ternary statement is not escaped: ``hello`` is marked as being
- safe and Twig does not escape static values (see
- :doc:`escape<../tags/autoescape>`). In the second ternary statement, even
- if ``hello`` is marked as safe, ``hola`` remains unsafe and so is the whole
- expression. The third ternary statement is marked as safe and the result is
- not escaped.
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/replace.rst b/plugins/twig/vendor/twig/twig/doc/filters/replace.rst
deleted file mode 100644
index 1227957b..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/replace.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-``replace``
-===========
-
-The ``replace`` filter formats a given string by replacing the placeholders
-(placeholders are free-form):
-
-.. code-block:: jinja
-
- {{ "I like %this% and %that%."|replace({'%this%': foo, '%that%': "bar"}) }}
-
- {# outputs I like foo and bar
- if the foo parameter equals to the foo string. #}
-
-Arguments
----------
-
-* ``replace_pairs``: The placeholder values
-
-.. seealso:: :doc:`format`
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/reverse.rst b/plugins/twig/vendor/twig/twig/doc/filters/reverse.rst
deleted file mode 100644
index 76fd2c1a..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/reverse.rst
+++ /dev/null
@@ -1,47 +0,0 @@
-``reverse``
-===========
-
-.. versionadded:: 1.6
- Support for strings has been added in Twig 1.6.
-
-The ``reverse`` filter reverses a sequence, a mapping, or a string:
-
-.. code-block:: jinja
-
- {% for user in users|reverse %}
- ...
- {% endfor %}
-
- {{ '1234'|reverse }}
-
- {# outputs 4321 #}
-
-.. tip::
-
- For sequences and mappings, numeric keys are not preserved. To reverse
- them as well, pass ``true`` as an argument to the ``reverse`` filter:
-
- .. code-block:: jinja
-
- {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse %}
- {{ key }}: {{ value }}
- {%- endfor %}
-
- {# output: 0: c 1: b 2: a #}
-
- {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse(true) %}
- {{ key }}: {{ value }}
- {%- endfor %}
-
- {# output: 3: c 2: b 1: a #}
-
-.. note::
-
- It also works with objects implementing the `Traversable`_ interface.
-
-Arguments
----------
-
-* ``preserve_keys``: Preserve keys when reversing a mapping or a sequence.
-
-.. _`Traversable`: http://php.net/Traversable
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/round.rst b/plugins/twig/vendor/twig/twig/doc/filters/round.rst
deleted file mode 100644
index 2521cf16..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/round.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-``round``
-=========
-
-.. versionadded:: 1.15.0
- The ``round`` filter was added in Twig 1.15.0.
-
-The ``round`` filter rounds a number to a given precision:
-
-.. code-block:: jinja
-
- {{ 42.55|round }}
- {# outputs 43 #}
-
- {{ 42.55|round(1, 'floor') }}
- {# outputs 42.5 #}
-
-The ``round`` filter takes two optional arguments; the first one specifies the
-precision (default is ``0``) and the second the rounding method (default is
-``common``):
-
-* ``common`` rounds either up or down (rounds the value up to precision decimal
- places away from zero, when it is half way there -- making 1.5 into 2 and
- -1.5 into -2);
-
-* ``ceil`` always rounds up;
-
-* ``floor`` always rounds down.
-
-.. note::
-
- The ``//`` operator is equivalent to ``|round(0, 'floor')``.
-
-Arguments
----------
-
-* ``precision``: The rounding precision
-* ``method``: The rounding method
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/slice.rst b/plugins/twig/vendor/twig/twig/doc/filters/slice.rst
deleted file mode 100644
index 70bf139e..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/slice.rst
+++ /dev/null
@@ -1,71 +0,0 @@
-``slice``
-===========
-
-.. versionadded:: 1.6
- The ``slice`` filter was added in Twig 1.6.
-
-The ``slice`` filter extracts a slice of a sequence, a mapping, or a string:
-
-.. code-block:: jinja
-
- {% for i in [1, 2, 3, 4, 5]|slice(1, 2) %}
- {# will iterate over 2 and 3 #}
- {% endfor %}
-
- {{ '12345'|slice(1, 2) }}
-
- {# outputs 23 #}
-
-You can use any valid expression for both the start and the length:
-
-.. code-block:: jinja
-
- {% for i in [1, 2, 3, 4, 5]|slice(start, length) %}
- {# ... #}
- {% endfor %}
-
-As syntactic sugar, you can also use the ``[]`` notation:
-
-.. code-block:: jinja
-
- {% for i in [1, 2, 3, 4, 5][start:length] %}
- {# ... #}
- {% endfor %}
-
- {{ '12345'[1:2] }} {# will display "23" #}
-
- {# you can omit the first argument -- which is the same as 0 #}
- {{ '12345'[:2] }} {# will display "12" #}
-
- {# you can omit the last argument -- which will select everything till the end #}
- {{ '12345'[2:] }} {# will display "345" #}
-
-The ``slice`` filter works as the `array_slice`_ PHP function for arrays and
-`mb_substr`_ for strings with a fallback to `substr`_.
-
-If the start is non-negative, the sequence will start at that start in the
-variable. If start is negative, the sequence will start that far from the end
-of the variable.
-
-If length is given and is positive, then the sequence will have up to that
-many elements in it. If the variable is shorter than the length, then only the
-available variable elements will be present. If length is given and is
-negative then the sequence will stop that many elements from the end of the
-variable. If it is omitted, then the sequence will have everything from offset
-up until the end of the variable.
-
-.. note::
-
- It also works with objects implementing the `Traversable`_ interface.
-
-Arguments
----------
-
-* ``start``: The start of the slice
-* ``length``: The size of the slice
-* ``preserve_keys``: Whether to preserve key or not (when the input is an array)
-
-.. _`Traversable`: http://php.net/manual/en/class.traversable.php
-.. _`array_slice`: http://php.net/array_slice
-.. _`mb_substr` : http://php.net/mb-substr
-.. _`substr`: http://php.net/substr
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/sort.rst b/plugins/twig/vendor/twig/twig/doc/filters/sort.rst
deleted file mode 100644
index 350207f8..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/sort.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-``sort``
-========
-
-The ``sort`` filter sorts an array:
-
-.. code-block:: jinja
-
- {% for user in users|sort %}
- ...
- {% endfor %}
-
-.. note::
-
- Internally, Twig uses the PHP `asort`_ function to maintain index
- association. It supports Traversable objects by transforming
- those to arrays.
-
-.. _`asort`: http://php.net/asort
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/split.rst b/plugins/twig/vendor/twig/twig/doc/filters/split.rst
deleted file mode 100644
index bbc6d798..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/split.rst
+++ /dev/null
@@ -1,53 +0,0 @@
-``split``
-=========
-
-.. versionadded:: 1.10.3
- The ``split`` filter was added in Twig 1.10.3.
-
-The ``split`` filter splits a string by the given delimiter and returns a list
-of strings:
-
-.. code-block:: jinja
-
- {% set foo = "one,two,three"|split(',') %}
- {# foo contains ['one', 'two', 'three'] #}
-
-You can also pass a ``limit`` argument:
-
- * If ``limit`` is positive, the returned array will contain a maximum of
- limit elements with the last element containing the rest of string;
-
- * If ``limit`` is negative, all components except the last -limit are
- returned;
-
- * If ``limit`` is zero, then this is treated as 1.
-
-.. code-block:: jinja
-
- {% set foo = "one,two,three,four,five"|split(',', 3) %}
- {# foo contains ['one', 'two', 'three,four,five'] #}
-
-If the ``delimiter`` is an empty string, then value will be split by equal
-chunks. Length is set by the ``limit`` argument (one character by default).
-
-.. code-block:: jinja
-
- {% set foo = "123"|split('') %}
- {# foo contains ['1', '2', '3'] #}
-
- {% set bar = "aabbcc"|split('', 2) %}
- {# bar contains ['aa', 'bb', 'cc'] #}
-
-.. note::
-
- Internally, Twig uses the PHP `explode`_ or `str_split`_ (if delimiter is
- empty) functions for string splitting.
-
-Arguments
----------
-
-* ``delimiter``: The delimiter
-* ``limit``: The limit argument
-
-.. _`explode`: http://php.net/explode
-.. _`str_split`: http://php.net/str_split
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/striptags.rst b/plugins/twig/vendor/twig/twig/doc/filters/striptags.rst
deleted file mode 100644
index 72c6f252..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/striptags.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-``striptags``
-=============
-
-The ``striptags`` filter strips SGML/XML tags and replace adjacent whitespace
-by one space:
-
-.. code-block:: jinja
-
- {{ some_html|striptags }}
-
-.. note::
-
- Internally, Twig uses the PHP `strip_tags`_ function.
-
-.. _`strip_tags`: http://php.net/strip_tags
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/title.rst b/plugins/twig/vendor/twig/twig/doc/filters/title.rst
deleted file mode 100644
index c5a318e8..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/title.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-``title``
-=========
-
-The ``title`` filter returns a titlecased version of the value. Words will
-start with uppercase letters, all remaining characters are lowercase:
-
-.. code-block:: jinja
-
- {{ 'my first car'|title }}
-
- {# outputs 'My First Car' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/trim.rst b/plugins/twig/vendor/twig/twig/doc/filters/trim.rst
deleted file mode 100644
index 4ddb2083..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/trim.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-``trim``
-========
-
-.. versionadded:: 1.6.2
- The ``trim`` filter was added in Twig 1.6.2.
-
-The ``trim`` filter strips whitespace (or other characters) from the beginning
-and end of a string:
-
-.. code-block:: jinja
-
- {{ ' I like Twig. '|trim }}
-
- {# outputs 'I like Twig.' #}
-
- {{ ' I like Twig.'|trim('.') }}
-
- {# outputs ' I like Twig' #}
-
-.. note::
-
- Internally, Twig uses the PHP `trim`_ function.
-
-Arguments
----------
-
-* ``character_mask``: The characters to strip
-
-.. _`trim`: http://php.net/trim
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/upper.rst b/plugins/twig/vendor/twig/twig/doc/filters/upper.rst
deleted file mode 100644
index 561cebe3..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/upper.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-``upper``
-=========
-
-The ``upper`` filter converts a value to uppercase:
-
-.. code-block:: jinja
-
- {{ 'welcome'|upper }}
-
- {# outputs 'WELCOME' #}
diff --git a/plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst b/plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst
deleted file mode 100644
index 5944e59c..00000000
--- a/plugins/twig/vendor/twig/twig/doc/filters/url_encode.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-``url_encode``
-==============
-
-.. versionadded:: 1.12.3
- Support for encoding an array as query string was added in Twig 1.12.3.
-
-.. versionadded:: 1.16.0
- The ``raw`` argument was removed in Twig 1.16.0. Twig now always encodes
- according to RFC 3986.
-
-The ``url_encode`` filter percent encodes a given string as URL segment
-or an array as query string:
-
-.. code-block:: jinja
-
- {{ "path-seg*ment"|url_encode }}
- {# outputs "path-seg%2Ament" #}
-
- {{ "string with spaces"|url_encode }}
- {# outputs "string%20with%20spaces" #}
-
- {{ {'param': 'value', 'foo': 'bar'}|url_encode }}
- {# outputs "param=value&foo=bar" #}
-
-.. note::
-
- Internally, Twig uses the PHP `urlencode`_ (or `rawurlencode`_ if you pass
- ``true`` as the first parameter) or the `http_build_query`_ function. Note
- that as of Twig 1.16.0, ``urlencode`` **always** uses ``rawurlencode`` (the
- ``raw`` argument was removed.)
-
-.. _`urlencode`: http://php.net/urlencode
-.. _`rawurlencode`: http://php.net/rawurlencode
-.. _`http_build_query`: http://php.net/http_build_query
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/attribute.rst b/plugins/twig/vendor/twig/twig/doc/functions/attribute.rst
deleted file mode 100644
index ceba96b0..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/attribute.rst
+++ /dev/null
@@ -1,26 +0,0 @@
-``attribute``
-=============
-
-.. versionadded:: 1.2
- The ``attribute`` function was added in Twig 1.2.
-
-The ``attribute`` function can be used to access a "dynamic" attribute of a
-variable:
-
-.. code-block:: jinja
-
- {{ attribute(object, method) }}
- {{ attribute(object, method, arguments) }}
- {{ attribute(array, item) }}
-
-In addition, the ``defined`` test can check for the existence of a dynamic
-attribute:
-
-.. code-block:: jinja
-
- {{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}
-
-.. note::
-
- The resolution algorithm is the same as the one used for the ``.``
- notation, except that the item can be any valid expression.
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/block.rst b/plugins/twig/vendor/twig/twig/doc/functions/block.rst
deleted file mode 100644
index fd571efb..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/block.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-``block``
-=========
-
-When a template uses inheritance and if you want to print a block multiple
-times, use the ``block`` function:
-
-.. code-block:: jinja
-
- {% block title %}{% endblock %}
-
-
{{ block('title') }}
-
- {% block body %}{% endblock %}
-
-.. seealso:: :doc:`extends<../tags/extends>`, :doc:`parent<../functions/parent>`
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/constant.rst b/plugins/twig/vendor/twig/twig/doc/functions/constant.rst
deleted file mode 100644
index bea0e9fc..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/constant.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-``constant``
-============
-
-.. versionadded: 1.12.1
- constant now accepts object instances as the second argument.
-
-``constant`` returns the constant value for a given string:
-
-.. code-block:: jinja
-
- {{ some_date|date(constant('DATE_W3C')) }}
- {{ constant('Namespace\\Classname::CONSTANT_NAME') }}
-
-As of 1.12.1 you can read constants from object instances as well:
-
-.. code-block:: jinja
-
- {{ constant('RSS', date) }}
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/cycle.rst b/plugins/twig/vendor/twig/twig/doc/functions/cycle.rst
deleted file mode 100644
index e3434932..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/cycle.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-``cycle``
-=========
-
-The ``cycle`` function cycles on an array of values:
-
-.. code-block:: jinja
-
- {% set start_year = date() | date('Y') %}
- {% set end_year = start_year + 5 %}
-
- {% for year in start_year..end_year %}
- {{ cycle(['odd', 'even'], loop.index0) }}
- {% endfor %}
-
-The array can contain any number of values:
-
-.. code-block:: jinja
-
- {% set fruits = ['apple', 'orange', 'citrus'] %}
-
- {% for i in 0..10 %}
- {{ cycle(fruits, i) }}
- {% endfor %}
-
-Arguments
----------
-
-* ``position``: The cycle position
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/date.rst b/plugins/twig/vendor/twig/twig/doc/functions/date.rst
deleted file mode 100644
index 714e08c4..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/date.rst
+++ /dev/null
@@ -1,52 +0,0 @@
-``date``
-========
-
-.. versionadded:: 1.6
- The date function has been added in Twig 1.6.
-
-.. versionadded:: 1.6.1
- The default timezone support has been added in Twig 1.6.1.
-
-Converts an argument to a date to allow date comparison:
-
-.. code-block:: jinja
-
- {% if date(user.created_at) < date('-2days') %}
- {# do something #}
- {% endif %}
-
-The argument must be in one of PHP’s supported `date and time formats`_.
-
-You can pass a timezone as the second argument:
-
-.. code-block:: jinja
-
- {% if date(user.created_at) < date('-2days', 'Europe/Paris') %}
- {# do something #}
- {% endif %}
-
-If no argument is passed, the function returns the current date:
-
-.. code-block:: jinja
-
- {% if date(user.created_at) < date() %}
- {# always! #}
- {% endif %}
-
-.. note::
-
- You can set the default timezone globally by calling ``setTimezone()`` on
- the ``core`` extension instance:
-
- .. code-block:: php
-
- $twig = new Twig_Environment($loader);
- $twig->getExtension('core')->setTimezone('Europe/Paris');
-
-Arguments
----------
-
-* ``date``: The date
-* ``timezone``: The timezone
-
-.. _`date and time formats`: http://php.net/manual/en/datetime.formats.php
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/dump.rst b/plugins/twig/vendor/twig/twig/doc/functions/dump.rst
deleted file mode 100644
index a231f089..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/dump.rst
+++ /dev/null
@@ -1,69 +0,0 @@
-``dump``
-========
-
-.. versionadded:: 1.5
- The ``dump`` function was added in Twig 1.5.
-
-The ``dump`` function dumps information about a template variable. This is
-mostly useful to debug a template that does not behave as expected by
-introspecting its variables:
-
-.. code-block:: jinja
-
- {{ dump(user) }}
-
-.. note::
-
- The ``dump`` function is not available by default. You must add the
- ``Twig_Extension_Debug`` extension explicitly when creating your Twig
- environment::
-
- $twig = new Twig_Environment($loader, array(
- 'debug' => true,
- // ...
- ));
- $twig->addExtension(new Twig_Extension_Debug());
-
- Even when enabled, the ``dump`` function won't display anything if the
- ``debug`` option on the environment is not enabled (to avoid leaking debug
- information on a production server).
-
-In an HTML context, wrap the output with a ``pre`` tag to make it easier to
-read:
-
-.. code-block:: jinja
-
-
- {{ dump(user) }}
-
-
-.. tip::
-
- Using a ``pre`` tag is not needed when `XDebug`_ is enabled and
- ``html_errors`` is ``on``; as a bonus, the output is also nicer with
- XDebug enabled.
-
-You can debug several variables by passing them as additional arguments:
-
-.. code-block:: jinja
-
- {{ dump(user, categories) }}
-
-If you don't pass any value, all variables from the current context are
-dumped:
-
-.. code-block:: jinja
-
- {{ dump() }}
-
-.. note::
-
- Internally, Twig uses the PHP `var_dump`_ function.
-
-Arguments
----------
-
-* ``context``: The context to dump
-
-.. _`XDebug`: http://xdebug.org/docs/display
-.. _`var_dump`: http://php.net/var_dump
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/include.rst b/plugins/twig/vendor/twig/twig/doc/functions/include.rst
deleted file mode 100644
index 33bd56d1..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/include.rst
+++ /dev/null
@@ -1,80 +0,0 @@
-``include``
-===========
-
-.. versionadded:: 1.12
- The ``include`` function was added in Twig 1.12.
-
-The ``include`` function returns the rendered content of a template:
-
-.. code-block:: jinja
-
- {{ include('template.html') }}
- {{ include(some_var) }}
-
-Included templates have access to the variables of the active context.
-
-If you are using the filesystem loader, the templates are looked for in the
-paths defined by it.
-
-The context is passed by default to the template but you can also pass
-additional variables:
-
-.. code-block:: jinja
-
- {# template.html will have access to the variables from the current context and the additional ones provided #}
- {{ include('template.html', {foo: 'bar'}) }}
-
-You can disable access to the context by setting ``with_context`` to
-``false``:
-
-.. code-block:: jinja
-
- {# only the foo variable will be accessible #}
- {{ include('template.html', {foo: 'bar'}, with_context = false) }}
-
-.. code-block:: jinja
-
- {# no variables will be accessible #}
- {{ include('template.html', with_context = false) }}
-
-And if the expression evaluates to a ``Twig_Template`` object, Twig will use it
-directly::
-
- // {{ include(template) }}
-
- $template = $twig->loadTemplate('some_template.twig');
-
- $twig->loadTemplate('template.twig')->display(array('template' => $template));
-
-When you set the ``ignore_missing`` flag, Twig will return an empty string if
-the template does not exist:
-
-.. code-block:: jinja
-
- {{ include('sidebar.html', ignore_missing = true) }}
-
-You can also provide a list of templates that are checked for existence before
-inclusion. The first template that exists will be rendered:
-
-.. code-block:: jinja
-
- {{ include(['page_detailed.html', 'page.html']) }}
-
-If ``ignore_missing`` is set, it will fall back to rendering nothing if none
-of the templates exist, otherwise it will throw an exception.
-
-When including a template created by an end user, you should consider
-sandboxing it:
-
-.. code-block:: jinja
-
- {{ include('page.html', sandboxed = true) }}
-
-Arguments
----------
-
-* ``template``: The template to render
-* ``variables``: The variables to pass to the template
-* ``with_context``: Whether to pass the current context variables or not
-* ``ignore_missing``: Whether to ignore missing templates or not
-* ``sandboxed``: Whether to sandbox the template or not
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/index.rst b/plugins/twig/vendor/twig/twig/doc/functions/index.rst
deleted file mode 100644
index 07214a76..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/index.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-Functions
-=========
-
-.. toctree::
- :maxdepth: 1
-
- attribute
- block
- constant
- cycle
- date
- dump
- include
- max
- min
- parent
- random
- range
- source
- template_from_string
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/max.rst b/plugins/twig/vendor/twig/twig/doc/functions/max.rst
deleted file mode 100644
index 6f3cfc53..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/max.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-``max``
-=======
-
-.. versionadded:: 1.15
- The ``max`` function was added in Twig 1.15.
-
-``max`` returns the biggest value of a sequence or a set of values:
-
-.. code-block:: jinja
-
- {{ max(1, 3, 2) }}
- {{ max([1, 3, 2]) }}
-
-When called with a mapping, max ignores keys and only compares values:
-
-.. code-block:: jinja
-
- {{ max({2: "e", 1: "a", 3: "b", 5: "d", 4: "c"}) }}
- {# returns "e" #}
-
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/min.rst b/plugins/twig/vendor/twig/twig/doc/functions/min.rst
deleted file mode 100644
index 7b6a65e1..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/min.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-``min``
-=======
-
-.. versionadded:: 1.15
- The ``min`` function was added in Twig 1.15.
-
-``min`` returns the lowest value of a sequence or a set of values:
-
-.. code-block:: jinja
-
- {{ min(1, 3, 2) }}
- {{ min([1, 3, 2]) }}
-
-When called with a mapping, min ignores keys and only compares values:
-
-.. code-block:: jinja
-
- {{ min({2: "e", 3: "a", 1: "b", 5: "d", 4: "c"}) }}
- {# returns "a" #}
-
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/parent.rst b/plugins/twig/vendor/twig/twig/doc/functions/parent.rst
deleted file mode 100644
index f5bd2001..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/parent.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-``parent``
-==========
-
-When a template uses inheritance, it's possible to render the contents of the
-parent block when overriding a block by using the ``parent`` function:
-
-.. code-block:: jinja
-
- {% extends "base.html" %}
-
- {% block sidebar %}
-
Table Of Contents
- ...
- {{ parent() }}
- {% endblock %}
-
-The ``parent()`` call will return the content of the ``sidebar`` block as
-defined in the ``base.html`` template.
-
-.. seealso:: :doc:`extends<../tags/extends>`, :doc:`block<../functions/block>`, :doc:`block<../tags/block>`
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/random.rst b/plugins/twig/vendor/twig/twig/doc/functions/random.rst
deleted file mode 100644
index 168e74f8..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/random.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-``random``
-==========
-
-.. versionadded:: 1.5
- The ``random`` function was added in Twig 1.5.
-
-.. versionadded:: 1.6
- String and integer handling was added in Twig 1.6.
-
-The ``random`` function returns a random value depending on the supplied
-parameter type:
-
-* a random item from a sequence;
-* a random character from a string;
-* a random integer between 0 and the integer parameter (inclusive).
-
-.. code-block:: jinja
-
- {{ random(['apple', 'orange', 'citrus']) }} {# example output: orange #}
- {{ random('ABC') }} {# example output: C #}
- {{ random() }} {# example output: 15386094 (works as the native PHP mt_rand function) #}
- {{ random(5) }} {# example output: 3 #}
-
-Arguments
----------
-
-* ``values``: The values
-
-.. _`mt_rand`: http://php.net/mt_rand
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/range.rst b/plugins/twig/vendor/twig/twig/doc/functions/range.rst
deleted file mode 100644
index b7cd0111..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/range.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-``range``
-=========
-
-Returns a list containing an arithmetic progression of integers:
-
-.. code-block:: jinja
-
- {% for i in range(0, 3) %}
- {{ i }},
- {% endfor %}
-
- {# outputs 0, 1, 2, 3, #}
-
-When step is given (as the third parameter), it specifies the increment (or
-decrement):
-
-.. code-block:: jinja
-
- {% for i in range(0, 6, 2) %}
- {{ i }},
- {% endfor %}
-
- {# outputs 0, 2, 4, 6, #}
-
-The Twig built-in ``..`` operator is just syntactic sugar for the ``range``
-function (with a step of 1):
-
-.. code-block:: jinja
-
- {% for i in 0..3 %}
- {{ i }},
- {% endfor %}
-
-.. tip::
-
- The ``range`` function works as the native PHP `range`_ function.
-
-Arguments
----------
-
-* ``low``: The first value of the sequence.
-* ``high``: The highest possible value of the sequence.
-* ``step``: The increment between elements of the sequence.
-
-.. _`range`: http://php.net/range
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/source.rst b/plugins/twig/vendor/twig/twig/doc/functions/source.rst
deleted file mode 100644
index 3c921b1c..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/source.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-``source``
-==========
-
-.. versionadded:: 1.15
- The ``source`` function was added in Twig 1.15.
-
-.. versionadded:: 1.18.3
- The ``ignore_missing`` flag was added in Twig 1.18.3.
-
-The ``source`` function returns the content of a template without rendering it:
-
-.. code-block:: jinja
-
- {{ source('template.html') }}
- {{ source(some_var) }}
-
-When you set the ``ignore_missing`` flag, Twig will return an empty string if
-the template does not exist:
-
-.. code-block:: jinja
-
- {{ source('template.html', ignore_missing = true) }}
-
-The function uses the same template loaders as the ones used to include
-templates. So, if you are using the filesystem loader, the templates are looked
-for in the paths defined by it.
-
-Arguments
----------
-
-* ``name``: The name of the template to read
-* ``ignore_missing``: Whether to ignore missing templates or not
diff --git a/plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst b/plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst
deleted file mode 100644
index ce6a60dc..00000000
--- a/plugins/twig/vendor/twig/twig/doc/functions/template_from_string.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-``template_from_string``
-========================
-
-.. versionadded:: 1.11
- The ``template_from_string`` function was added in Twig 1.11.
-
-The ``template_from_string`` function loads a template from a string:
-
-.. code-block:: jinja
-
- {{ include(template_from_string("Hello {{ name }}")) }}
- {{ include(template_from_string(page.template)) }}
-
-.. note::
-
- The ``template_from_string`` function is not available by default. You
- must add the ``Twig_Extension_StringLoader`` extension explicitly when
- creating your Twig environment::
-
- $twig = new Twig_Environment(...);
- $twig->addExtension(new Twig_Extension_StringLoader());
-
-.. note::
-
- Even if you will probably always use the ``template_from_string`` function
- with the ``include`` function, you can use it with any tag or function that
- takes a template as an argument (like the ``embed`` or ``extends`` tags).
-
-Arguments
----------
-
-* ``template``: The template
diff --git a/plugins/twig/vendor/twig/twig/doc/index.rst b/plugins/twig/vendor/twig/twig/doc/index.rst
deleted file mode 100644
index 358bd738..00000000
--- a/plugins/twig/vendor/twig/twig/doc/index.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-Twig
-====
-
-.. toctree::
- :maxdepth: 2
-
- intro
- installation
- templates
- api
- advanced
- internals
- deprecated
- recipes
- coding_standards
- tags/index
- filters/index
- functions/index
- tests/index
diff --git a/plugins/twig/vendor/twig/twig/doc/installation.rst b/plugins/twig/vendor/twig/twig/doc/installation.rst
deleted file mode 100644
index afdcf165..00000000
--- a/plugins/twig/vendor/twig/twig/doc/installation.rst
+++ /dev/null
@@ -1,116 +0,0 @@
-Installation
-============
-
-You have multiple ways to install Twig.
-
-Installing the Twig PHP package
--------------------------------
-
-Installing via Composer (recommended)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Install `Composer`_ and run the following command to get the latest version:
-
-.. code-block:: bash
-
- composer require twig/twig:~1.0
-
-Installing from the tarball release
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-1. Download the most recent tarball from the `download page`_
-2. Verify the integrity of the tarball http://fabien.potencier.org/article/73/signing-project-releases
-3. Unpack the tarball
-4. Move the files somewhere in your project
-
-Installing the development version
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block:: bash
-
- git clone git://github.com/twigphp/Twig.git
-
-Installing the PEAR package
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. note::
-
- Using PEAR for installing Twig is deprecated and Twig 1.15.1 was the last
- version published on the PEAR channel; use Composer instead.
-
-.. code-block:: bash
-
- pear channel-discover pear.twig-project.org
- pear install twig/Twig
-
-Installing the C extension
---------------------------
-
-.. versionadded:: 1.4
- The C extension was added in Twig 1.4.
-
-.. note::
-
- The C extension is **optional** but it brings some nice performance
- improvements. Note that the extension is not a replacement for the PHP
- code; it only implements a small part of the PHP code to improve the
- performance at runtime; you must still install the regular PHP code.
-
-Twig comes with a C extension that enhances the performance of the Twig
-runtime engine; install it like any other PHP extensions:
-
-.. code-block:: bash
-
- cd ext/twig
- phpize
- ./configure
- make
- make install
-
-.. note::
-
- You can also install the C extension via PEAR (note that this method is
- deprecated and newer versions of Twig are not available on the PEAR
- channel):
-
- .. code-block:: bash
-
- pear channel-discover pear.twig-project.org
- pear install twig/CTwig
-
-For Windows:
-
-1. Setup the build environment following the `PHP documentation`_
-2. Put Twig's C extension source code into ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\ext\twig``
-3. Use the ``configure --disable-all --enable-cli --enable-twig=shared`` command instead of step 14
-4. ``nmake``
-5. Copy the ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\Release_TS\php_twig.dll`` file to your PHP setup.
-
-.. tip::
-
- For Windows ZendServer, ZTS is not enabled as mentioned in `Zend Server
- FAQ`_.
-
- You have to use ``configure --disable-all --disable-zts --enable-cli
- --enable-twig=shared`` to be able to build the twig C extension for
- ZendServer.
-
- The built DLL will be available in
- ``C:\\php-sdk\\phpdev\\vcXX\\x86\\php-source-directory\\Release``
-
-Finally, enable the extension in your ``php.ini`` configuration file:
-
-.. code-block:: ini
-
- extension=twig.so #For Unix systems
- extension=php_twig.dll #For Windows systems
-
-And from now on, Twig will automatically compile your templates to take
-advantage of the C extension. Note that this extension does not replace the
-PHP code but only provides an optimized version of the
-``Twig_Template::getAttribute()`` method.
-
-.. _`download page`: https://github.com/twigphp/Twig/tags
-.. _`Composer`: https://getcomposer.org/download/
-.. _`PHP documentation`: https://wiki.php.net/internals/windows/stepbystepbuild
-.. _`Zend Server FAQ`: http://www.zend.com/en/products/server/faq#faqD6
diff --git a/plugins/twig/vendor/twig/twig/doc/internals.rst b/plugins/twig/vendor/twig/twig/doc/internals.rst
deleted file mode 100644
index ef1174dd..00000000
--- a/plugins/twig/vendor/twig/twig/doc/internals.rst
+++ /dev/null
@@ -1,138 +0,0 @@
-Twig Internals
-==============
-
-Twig is very extensible and you can easily hack it. Keep in mind that you
-should probably try to create an extension before hacking the core, as most
-features and enhancements can be handled with extensions. This chapter is also
-useful for people who want to understand how Twig works under the hood.
-
-How does Twig work?
--------------------
-
-The rendering of a Twig template can be summarized into four key steps:
-
-* **Load** the template: If the template is already compiled, load it and go
- to the *evaluation* step, otherwise:
-
- * First, the **lexer** tokenizes the template source code into small pieces
- for easier processing;
- * Then, the **parser** converts the token stream into a meaningful tree
- of nodes (the Abstract Syntax Tree);
- * Eventually, the *compiler* transforms the AST into PHP code.
-
-* **Evaluate** the template: It basically means calling the ``display()``
- method of the compiled template and passing it the context.
-
-The Lexer
----------
-
-The lexer tokenizes a template source code into a token stream (each token is
-an instance of ``Twig_Token``, and the stream is an instance of
-``Twig_TokenStream``). The default lexer recognizes 13 different token types:
-
-* ``Twig_Token::BLOCK_START_TYPE``, ``Twig_Token::BLOCK_END_TYPE``: Delimiters for blocks (``{% %}``)
-* ``Twig_Token::VAR_START_TYPE``, ``Twig_Token::VAR_END_TYPE``: Delimiters for variables (``{{ }}``)
-* ``Twig_Token::TEXT_TYPE``: A text outside an expression;
-* ``Twig_Token::NAME_TYPE``: A name in an expression;
-* ``Twig_Token::NUMBER_TYPE``: A number in an expression;
-* ``Twig_Token::STRING_TYPE``: A string in an expression;
-* ``Twig_Token::OPERATOR_TYPE``: An operator;
-* ``Twig_Token::PUNCTUATION_TYPE``: A punctuation sign;
-* ``Twig_Token::INTERPOLATION_START_TYPE``, ``Twig_Token::INTERPOLATION_END_TYPE`` (as of Twig 1.5): Delimiters for string interpolation;
-* ``Twig_Token::EOF_TYPE``: Ends of template.
-
-You can manually convert a source code into a token stream by calling the
-``tokenize()`` method of an environment::
-
- $stream = $twig->tokenize($source, $identifier);
-
-As the stream has a ``__toString()`` method, you can have a textual
-representation of it by echoing the object::
-
- echo $stream."\n";
-
-Here is the output for the ``Hello {{ name }}`` template:
-
-.. code-block:: text
-
- TEXT_TYPE(Hello )
- VAR_START_TYPE()
- NAME_TYPE(name)
- VAR_END_TYPE()
- EOF_TYPE()
-
-.. note::
-
- The default lexer (``Twig_Lexer``) can be changed by calling
- the ``setLexer()`` method::
-
- $twig->setLexer($lexer);
-
-The Parser
-----------
-
-The parser converts the token stream into an AST (Abstract Syntax Tree), or a
-node tree (an instance of ``Twig_Node_Module``). The core extension defines
-the basic nodes like: ``for``, ``if``, ... and the expression nodes.
-
-You can manually convert a token stream into a node tree by calling the
-``parse()`` method of an environment::
-
- $nodes = $twig->parse($stream);
-
-Echoing the node object gives you a nice representation of the tree::
-
- echo $nodes."\n";
-
-Here is the output for the ``Hello {{ name }}`` template:
-
-.. code-block:: text
-
- Twig_Node_Module(
- Twig_Node_Text(Hello )
- Twig_Node_Print(
- Twig_Node_Expression_Name(name)
- )
- )
-
-.. note::
-
- The default parser (``Twig_TokenParser``) can be changed by calling the
- ``setParser()`` method::
-
- $twig->setParser($parser);
-
-The Compiler
-------------
-
-The last step is done by the compiler. It takes a node tree as an input and
-generates PHP code usable for runtime execution of the template.
-
-You can manually compile a node tree to PHP code with the ``compile()`` method
-of an environment::
-
- $php = $twig->compile($nodes);
-
-The generated template for a ``Hello {{ name }}`` template reads as follows
-(the actual output can differ depending on the version of Twig you are
-using)::
-
- /* Hello {{ name }} */
- class __TwigTemplate_1121b6f109fe93ebe8c6e22e3712bceb extends Twig_Template
- {
- protected function doDisplay(array $context, array $blocks = array())
- {
- // line 1
- echo "Hello ";
- echo twig_escape_filter($this->env, isset($context["name"]) ? $context["name"] : null), "html", null, true);
- }
-
- // some more code
- }
-
-.. note::
-
- The default compiler (``Twig_Compiler``) can be changed by calling the
- ``setCompiler()`` method::
-
- $twig->setCompiler($compiler);
diff --git a/plugins/twig/vendor/twig/twig/doc/intro.rst b/plugins/twig/vendor/twig/twig/doc/intro.rst
deleted file mode 100644
index 9b38c97d..00000000
--- a/plugins/twig/vendor/twig/twig/doc/intro.rst
+++ /dev/null
@@ -1,85 +0,0 @@
-Introduction
-============
-
-This is the documentation for Twig, the flexible, fast, and secure template
-engine for PHP.
-
-If you have any exposure to other text-based template languages, such as
-Smarty, Django, or Jinja, you should feel right at home with Twig. It's both
-designer and developer friendly by sticking to PHP's principles and adding
-functionality useful for templating environments.
-
-The key-features are...
-
-* *Fast*: Twig compiles templates down to plain optimized PHP code. The
- overhead compared to regular PHP code was reduced to the very minimum.
-
-* *Secure*: Twig has a sandbox mode to evaluate untrusted template code. This
- allows Twig to be used as a template language for applications where users
- may modify the template design.
-
-* *Flexible*: Twig is powered by a flexible lexer and parser. This allows the
- developer to define its own custom tags and filters, and create its own DSL.
-
-Twig is used by many Open-Source projects like Symfony, Drupal8, eZPublish,
-phpBB, Piwik, OroCRM, and many frameworks have support for it as well like
-Slim, Yii, Laravel, Codeigniter, and Kohana, just to name a few.
-
-Prerequisites
--------------
-
-Twig needs at least **PHP 5.2.7** to run.
-
-Installation
-------------
-
-The recommended way to install Twig is via Composer:
-
-.. code-block:: bash
-
- composer require "twig/twig:~1.0"
-
-.. note::
-
- To learn more about the other installation methods, read the
- :doc:`installation` chapter; it also explains how to install
- the Twig C extension.
-
-Basic API Usage
----------------
-
-This section gives you a brief introduction to the PHP API for Twig.
-
-.. code-block:: php
-
- require_once '/path/to/vendor/autoload.php';
-
- $loader = new Twig_Loader_Array(array(
- 'index' => 'Hello {{ name }}!',
- ));
- $twig = new Twig_Environment($loader);
-
- echo $twig->render('index', array('name' => 'Fabien'));
-
-Twig uses a loader (``Twig_Loader_Array``) to locate templates, and an
-environment (``Twig_Environment``) to store the configuration.
-
-The ``render()`` method loads the template passed as a first argument and
-renders it with the variables passed as a second argument.
-
-As templates are generally stored on the filesystem, Twig also comes with a
-filesystem loader::
-
- $loader = new Twig_Loader_Filesystem('/path/to/templates');
- $twig = new Twig_Environment($loader, array(
- 'cache' => '/path/to/compilation_cache',
- ));
-
- echo $twig->render('index.html', array('name' => 'Fabien'));
-
-.. tip::
-
- If you are not using Composer, use the Twig built-in autoloader::
-
- require_once '/path/to/lib/Twig/Autoloader.php';
- Twig_Autoloader::register();
diff --git a/plugins/twig/vendor/twig/twig/doc/recipes.rst b/plugins/twig/vendor/twig/twig/doc/recipes.rst
deleted file mode 100644
index 6ad53276..00000000
--- a/plugins/twig/vendor/twig/twig/doc/recipes.rst
+++ /dev/null
@@ -1,518 +0,0 @@
-Recipes
-=======
-
-.. _deprecation-notices:
-
-Displaying Deprecation Notices
-------------------------------
-
-.. versionadded:: 1.21
- This works as of Twig 1.21.
-
-Deprecated features generate deprecation notices (via a call to the
-``trigger_error()`` PHP function). By default, they are silenced and never
-displayed nor logged.
-
-To easily remove all deprecated feature usages from your templates, write and
-run a script along the lines of the following::
-
- require_once __DIR__.'/vendor/autoload.php';
-
- $twig = create_your_twig_env();
-
- $deprecations = new Twig_Util_DeprecationCollector($twig);
-
- print_r($deprecations->collectDir(__DIR__.'/templates'));
-
-The ``collectDir()`` method compiles all templates found in a directory,
-catches deprecation notices, and return them.
-
-.. tip::
-
- If your templates are not stored on the filesystem, use the ``collect()``
- method instead which takes an ``Iterator``; the iterator must return
- template names as keys and template contents as values (as done by
- ``Twig_Util_TemplateDirIterator``).
-
-However, this code won't find all deprecations (like using deprecated some Twig
-classes). To catch all notices, register a custom error handler like the one
-below::
-
- $deprecations = array();
- set_error_handler(function ($type, $msg) use (&$deprecations) {
- if (E_USER_DEPRECATED === $type) {
- $deprecations[] = $msg;
- }
- });
-
- // run your application
-
- print_r($deprecations);
-
-Note that most deprecation notices are triggered during **compilation**, so
-they won't be generated when templates are already cached.
-
-.. tip::
-
- If you want to manage the deprecation notices from your PHPUnit tests, have
- a look at the `symfony/phpunit-bridge
- `_ package, which eases the
- process a lot.
-
-Making a Layout conditional
----------------------------
-
-Working with Ajax means that the same content is sometimes displayed as is,
-and sometimes decorated with a layout. As Twig layout template names can be
-any valid expression, you can pass a variable that evaluates to ``true`` when
-the request is made via Ajax and choose the layout accordingly:
-
-.. code-block:: jinja
-
- {% extends request.ajax ? "base_ajax.html" : "base.html" %}
-
- {% block content %}
- This is the content to be displayed.
- {% endblock %}
-
-Making an Include dynamic
--------------------------
-
-When including a template, its name does not need to be a string. For
-instance, the name can depend on the value of a variable:
-
-.. code-block:: jinja
-
- {% include var ~ '_foo.html' %}
-
-If ``var`` evaluates to ``index``, the ``index_foo.html`` template will be
-rendered.
-
-As a matter of fact, the template name can be any valid expression, such as
-the following:
-
-.. code-block:: jinja
-
- {% include var|default('index') ~ '_foo.html' %}
-
-Overriding a Template that also extends itself
-----------------------------------------------
-
-A template can be customized in two different ways:
-
-* *Inheritance*: A template *extends* a parent template and overrides some
- blocks;
-
-* *Replacement*: If you use the filesystem loader, Twig loads the first
- template it finds in a list of configured directories; a template found in a
- directory *replaces* another one from a directory further in the list.
-
-But how do you combine both: *replace* a template that also extends itself
-(aka a template in a directory further in the list)?
-
-Let's say that your templates are loaded from both ``.../templates/mysite``
-and ``.../templates/default`` in this order. The ``page.twig`` template,
-stored in ``.../templates/default`` reads as follows:
-
-.. code-block:: jinja
-
- {# page.twig #}
- {% extends "layout.twig" %}
-
- {% block content %}
- {% endblock %}
-
-You can replace this template by putting a file with the same name in
-``.../templates/mysite``. And if you want to extend the original template, you
-might be tempted to write the following:
-
-.. code-block:: jinja
-
- {# page.twig in .../templates/mysite #}
- {% extends "page.twig" %} {# from .../templates/default #}
-
-Of course, this will not work as Twig will always load the template from
-``.../templates/mysite``.
-
-It turns out it is possible to get this to work, by adding a directory right
-at the end of your template directories, which is the parent of all of the
-other directories: ``.../templates`` in our case. This has the effect of
-making every template file within our system uniquely addressable. Most of the
-time you will use the "normal" paths, but in the special case of wanting to
-extend a template with an overriding version of itself we can reference its
-parent's full, unambiguous template path in the extends tag:
-
-.. code-block:: jinja
-
- {# page.twig in .../templates/mysite #}
- {% extends "default/page.twig" %} {# from .../templates #}
-
-.. note::
-
- This recipe was inspired by the following Django wiki page:
- http://code.djangoproject.com/wiki/ExtendingTemplates
-
-Customizing the Syntax
-----------------------
-
-Twig allows some syntax customization for the block delimiters. It's not
-recommended to use this feature as templates will be tied with your custom
-syntax. But for specific projects, it can make sense to change the defaults.
-
-To change the block delimiters, you need to create your own lexer object::
-
- $twig = new Twig_Environment();
-
- $lexer = new Twig_Lexer($twig, array(
- 'tag_comment' => array('{#', '#}'),
- 'tag_block' => array('{%', '%}'),
- 'tag_variable' => array('{{', '}}'),
- 'interpolation' => array('#{', '}'),
- ));
- $twig->setLexer($lexer);
-
-Here are some configuration example that simulates some other template engines
-syntax::
-
- // Ruby erb syntax
- $lexer = new Twig_Lexer($twig, array(
- 'tag_comment' => array('<%#', '%>'),
- 'tag_block' => array('<%', '%>'),
- 'tag_variable' => array('<%=', '%>'),
- ));
-
- // SGML Comment Syntax
- $lexer = new Twig_Lexer($twig, array(
- 'tag_comment' => array(''),
- 'tag_block' => array(''),
- 'tag_variable' => array('${', '}'),
- ));
-
- // Smarty like
- $lexer = new Twig_Lexer($twig, array(
- 'tag_comment' => array('{*', '*}'),
- 'tag_block' => array('{', '}'),
- 'tag_variable' => array('{$', '}'),
- ));
-
-Using dynamic Object Properties
--------------------------------
-
-When Twig encounters a variable like ``article.title``, it tries to find a
-``title`` public property in the ``article`` object.
-
-It also works if the property does not exist but is rather defined dynamically
-thanks to the magic ``__get()`` method; you just need to also implement the
-``__isset()`` magic method like shown in the following snippet of code::
-
- class Article
- {
- public function __get($name)
- {
- if ('title' == $name) {
- return 'The title';
- }
-
- // throw some kind of error
- }
-
- public function __isset($name)
- {
- if ('title' == $name) {
- return true;
- }
-
- return false;
- }
- }
-
-Accessing the parent Context in Nested Loops
---------------------------------------------
-
-Sometimes, when using nested loops, you need to access the parent context. The
-parent context is always accessible via the ``loop.parent`` variable. For
-instance, if you have the following template data::
-
- $data = array(
- 'topics' => array(
- 'topic1' => array('Message 1 of topic 1', 'Message 2 of topic 1'),
- 'topic2' => array('Message 1 of topic 2', 'Message 2 of topic 2'),
- ),
- );
-
-And the following template to display all messages in all topics:
-
-.. code-block:: jinja
-
- {% for topic, messages in topics %}
- * {{ loop.index }}: {{ topic }}
- {% for message in messages %}
- - {{ loop.parent.loop.index }}.{{ loop.index }}: {{ message }}
- {% endfor %}
- {% endfor %}
-
-The output will be similar to:
-
-.. code-block:: text
-
- * 1: topic1
- - 1.1: The message 1 of topic 1
- - 1.2: The message 2 of topic 1
- * 2: topic2
- - 2.1: The message 1 of topic 2
- - 2.2: The message 2 of topic 2
-
-In the inner loop, the ``loop.parent`` variable is used to access the outer
-context. So, the index of the current ``topic`` defined in the outer for loop
-is accessible via the ``loop.parent.loop.index`` variable.
-
-Defining undefined Functions and Filters on the Fly
----------------------------------------------------
-
-When a function (or a filter) is not defined, Twig defaults to throw a
-``Twig_Error_Syntax`` exception. However, it can also call a `callback`_ (any
-valid PHP callable) which should return a function (or a filter).
-
-For filters, register callbacks with ``registerUndefinedFilterCallback()``.
-For functions, use ``registerUndefinedFunctionCallback()``::
-
- // auto-register all native PHP functions as Twig functions
- // don't try this at home as it's not secure at all!
- $twig->registerUndefinedFunctionCallback(function ($name) {
- if (function_exists($name)) {
- return new Twig_Function_Function($name);
- }
-
- return false;
- });
-
-If the callable is not able to return a valid function (or filter), it must
-return ``false``.
-
-If you register more than one callback, Twig will call them in turn until one
-does not return ``false``.
-
-.. tip::
-
- As the resolution of functions and filters is done during compilation,
- there is no overhead when registering these callbacks.
-
-Validating the Template Syntax
-------------------------------
-
-When template code is provided by a third-party (through a web interface for
-instance), it might be interesting to validate the template syntax before
-saving it. If the template code is stored in a `$template` variable, here is
-how you can do it::
-
- try {
- $twig->parse($twig->tokenize($template));
-
- // the $template is valid
- } catch (Twig_Error_Syntax $e) {
- // $template contains one or more syntax errors
- }
-
-If you iterate over a set of files, you can pass the filename to the
-``tokenize()`` method to get the filename in the exception message::
-
- foreach ($files as $file) {
- try {
- $twig->parse($twig->tokenize($template, $file));
-
- // the $template is valid
- } catch (Twig_Error_Syntax $e) {
- // $template contains one or more syntax errors
- }
- }
-
-.. note::
-
- This method won't catch any sandbox policy violations because the policy
- is enforced during template rendering (as Twig needs the context for some
- checks like allowed methods on objects).
-
-Refreshing modified Templates when OPcache or APC is enabled
-------------------------------------------------------------
-
-When using OPcache with ``opcache.validate_timestamps`` set to ``0`` or APC
-with ``apc.stat`` set to ``0`` and Twig cache enabled, clearing the template
-cache won't update the cache.
-
-To get around this, force Twig to invalidate the bytecode cache::
-
- $twig = new Twig_Environment($loader, array(
- 'cache' => new Twig_Cache_Filesystem('/some/cache/path', Twig_Cache_Filesystem::FORCE_BYTECODE_INVALIDATION),
- // ...
- ));
-
-.. note::
-
- Before Twig 1.22, you should extend ``Twig_Environment`` instead::
-
- class OpCacheAwareTwigEnvironment extends Twig_Environment
- {
- protected function writeCacheFile($file, $content)
- {
- parent::writeCacheFile($file, $content);
-
- // Compile cached file into bytecode cache
- if (function_exists('opcache_invalidate')) {
- opcache_invalidate($file, true);
- } elseif (function_exists('apc_compile_file')) {
- apc_compile_file($file);
- }
- }
- }
-
-Reusing a stateful Node Visitor
--------------------------------
-
-When attaching a visitor to a ``Twig_Environment`` instance, Twig uses it to
-visit *all* templates it compiles. If you need to keep some state information
-around, you probably want to reset it when visiting a new template.
-
-This can be easily achieved with the following code::
-
- protected $someTemplateState = array();
-
- public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Module) {
- // reset the state as we are entering a new template
- $this->someTemplateState = array();
- }
-
- // ...
-
- return $node;
- }
-
-Using a Database to store Templates
------------------------------------
-
-If you are developing a CMS, templates are usually stored in a database. This
-recipe gives you a simple PDO template loader you can use as a starting point
-for your own.
-
-First, let's create a temporary in-memory SQLite3 database to work with::
-
- $dbh = new PDO('sqlite::memory:');
- $dbh->exec('CREATE TABLE templates (name STRING, source STRING, last_modified INTEGER)');
- $base = '{% block content %}{% endblock %}';
- $index = '
- {% extends "base.twig" %}
- {% block content %}Hello {{ name }}{% endblock %}
- ';
- $now = time();
- $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('base.twig', '$base', $now)");
- $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('index.twig', '$index', $now)");
-
-We have created a simple ``templates`` table that hosts two templates:
-``base.twig`` and ``index.twig``.
-
-Now, let's define a loader able to use this database::
-
- class DatabaseTwigLoader implements Twig_LoaderInterface, Twig_ExistsLoaderInterface
- {
- protected $dbh;
-
- public function __construct(PDO $dbh)
- {
- $this->dbh = $dbh;
- }
-
- public function getSource($name)
- {
- if (false === $source = $this->getValue('source', $name)) {
- throw new Twig_Error_Loader(sprintf('Template "%s" does not exist.', $name));
- }
-
- return $source;
- }
-
- // Twig_ExistsLoaderInterface as of Twig 1.11
- public function exists($name)
- {
- return $name === $this->getValue('name', $name);
- }
-
- public function getCacheKey($name)
- {
- return $name;
- }
-
- public function isFresh($name, $time)
- {
- if (false === $lastModified = $this->getValue('last_modified', $name)) {
- return false;
- }
-
- return $lastModified <= $time;
- }
-
- protected function getValue($column, $name)
- {
- $sth = $this->dbh->prepare('SELECT '.$column.' FROM templates WHERE name = :name');
- $sth->execute(array(':name' => (string) $name));
-
- return $sth->fetchColumn();
- }
- }
-
-Finally, here is an example on how you can use it::
-
- $loader = new DatabaseTwigLoader($dbh);
- $twig = new Twig_Environment($loader);
-
- echo $twig->render('index.twig', array('name' => 'Fabien'));
-
-Using different Template Sources
---------------------------------
-
-This recipe is the continuation of the previous one. Even if you store the
-contributed templates in a database, you might want to keep the original/base
-templates on the filesystem. When templates can be loaded from different
-sources, you need to use the ``Twig_Loader_Chain`` loader.
-
-As you can see in the previous recipe, we reference the template in the exact
-same way as we would have done it with a regular filesystem loader. This is
-the key to be able to mix and match templates coming from the database, the
-filesystem, or any other loader for that matter: the template name should be a
-logical name, and not the path from the filesystem::
-
- $loader1 = new DatabaseTwigLoader($dbh);
- $loader2 = new Twig_Loader_Array(array(
- 'base.twig' => '{% block content %}{% endblock %}',
- ));
- $loader = new Twig_Loader_Chain(array($loader1, $loader2));
-
- $twig = new Twig_Environment($loader);
-
- echo $twig->render('index.twig', array('name' => 'Fabien'));
-
-Now that the ``base.twig`` templates is defined in an array loader, you can
-remove it from the database, and everything else will still work as before.
-
-Loading a Template from a String
---------------------------------
-
-From a template, you can easily load a template stored in a string via the
-``template_from_string`` function (available as of Twig 1.11 via the
-``Twig_Extension_StringLoader`` extension)::
-
-.. code-block:: jinja
-
- {{ include(template_from_string("Hello {{ name }}")) }}
-
-From PHP, it's also possible to load a template stored in a string via
-``Twig_Environment::createTemplate()`` (available as of Twig 1.18)::
-
- $template = $twig->createTemplate('hello {{ name }}');
- echo $template->render(array('name' => 'Fabien'));
-
-.. note::
-
- Never use the ``Twig_Loader_String`` loader, which has severe limitations.
-
-.. _callback: http://www.php.net/manual/en/function.is-callable.php
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst b/plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst
deleted file mode 100644
index 4208d1a3..00000000
--- a/plugins/twig/vendor/twig/twig/doc/tags/autoescape.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-``autoescape``
-==============
-
-Whether automatic escaping is enabled or not, you can mark a section of a
-template to be escaped or not by using the ``autoescape`` tag:
-
-.. code-block:: jinja
-
- {# The following syntax works as of Twig 1.8 -- see the note below for previous versions #}
-
- {% autoescape %}
- Everything will be automatically escaped in this block
- using the HTML strategy
- {% endautoescape %}
-
- {% autoescape 'html' %}
- Everything will be automatically escaped in this block
- using the HTML strategy
- {% endautoescape %}
-
- {% autoescape 'js' %}
- Everything will be automatically escaped in this block
- using the js escaping strategy
- {% endautoescape %}
-
- {% autoescape false %}
- Everything will be outputted as is in this block
- {% endautoescape %}
-
-.. note::
-
- Before Twig 1.8, the syntax was different:
-
- .. code-block:: jinja
-
- {% autoescape true %}
- Everything will be automatically escaped in this block
- using the HTML strategy
- {% endautoescape %}
-
- {% autoescape false %}
- Everything will be outputted as is in this block
- {% endautoescape %}
-
- {% autoescape true js %}
- Everything will be automatically escaped in this block
- using the js escaping strategy
- {% endautoescape %}
-
-When automatic escaping is enabled everything is escaped by default except for
-values explicitly marked as safe. Those can be marked in the template by using
-the :doc:`raw<../filters/raw>` filter:
-
-.. code-block:: jinja
-
- {% autoescape %}
- {{ safe_value|raw }}
- {% endautoescape %}
-
-Functions returning template data (like :doc:`macros` and
-:doc:`parent<../functions/parent>`) always return safe markup.
-
-.. note::
-
- Twig is smart enough to not escape an already escaped value by the
- :doc:`escape<../filters/escape>` filter.
-
-.. note::
-
- Twig does not escape static expressions:
-
- .. code-block:: jinja
-
- {% set hello = "Hello" %}
- {{ hello }}
- {{ "world" }}
-
- Will be rendered "Hello **world**".
-
-.. note::
-
- The chapter :doc:`Twig for Developers<../api>` gives more information
- about when and how automatic escaping is applied.
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/block.rst b/plugins/twig/vendor/twig/twig/doc/tags/block.rst
deleted file mode 100644
index e3804823..00000000
--- a/plugins/twig/vendor/twig/twig/doc/tags/block.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-``block``
-=========
-
-Blocks are used for inheritance and act as placeholders and replacements at
-the same time. They are documented in detail in the documentation for the
-:doc:`extends<../tags/extends>` tag.
-
-Block names should consist of alphanumeric characters, and underscores. Dashes
-are not permitted.
-
-.. seealso:: :doc:`block<../functions/block>`, :doc:`parent<../functions/parent>`, :doc:`use<../tags/use>`, :doc:`extends<../tags/extends>`
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/do.rst b/plugins/twig/vendor/twig/twig/doc/tags/do.rst
deleted file mode 100644
index 1c344e30..00000000
--- a/plugins/twig/vendor/twig/twig/doc/tags/do.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-``do``
-======
-
-.. versionadded:: 1.5
- The ``do`` tag was added in Twig 1.5.
-
-The ``do`` tag works exactly like the regular variable expression (``{{ ...
-}}``) just that it doesn't print anything:
-
-.. code-block:: jinja
-
- {% do 1 + 2 %}
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/embed.rst b/plugins/twig/vendor/twig/twig/doc/tags/embed.rst
deleted file mode 100644
index 5a6a0299..00000000
--- a/plugins/twig/vendor/twig/twig/doc/tags/embed.rst
+++ /dev/null
@@ -1,178 +0,0 @@
-``embed``
-=========
-
-.. versionadded:: 1.8
- The ``embed`` tag was added in Twig 1.8.
-
-The ``embed`` tag combines the behaviour of :doc:`include` and
-:doc:`extends`.
-It allows you to include another template's contents, just like ``include``
-does. But it also allows you to override any block defined inside the
-included template, like when extending a template.
-
-Think of an embedded template as a "micro layout skeleton".
-
-.. code-block:: jinja
-
- {% embed "teasers_skeleton.twig" %}
- {# These blocks are defined in "teasers_skeleton.twig" #}
- {# and we override them right here: #}
- {% block left_teaser %}
- Some content for the left teaser box
- {% endblock %}
- {% block right_teaser %}
- Some content for the right teaser box
- {% endblock %}
- {% endembed %}
-
-The ``embed`` tag takes the idea of template inheritance to the level of
-content fragments. While template inheritance allows for "document skeletons",
-which are filled with life by child templates, the ``embed`` tag allows you to
-create "skeletons" for smaller units of content and re-use and fill them
-anywhere you like.
-
-Since the use case may not be obvious, let's look at a simplified example.
-Imagine a base template shared by multiple HTML pages, defining a single block
-named "content":
-
-.. code-block:: text
-
- ┌─── page layout ─────────────────────┐
- │ │
- │ ┌── block "content" ──┐ │
- │ │ │ │
- │ │ │ │
- │ │ (child template to │ │
- │ │ put content here) │ │
- │ │ │ │
- │ │ │ │
- │ └─────────────────────┘ │
- │ │
- └─────────────────────────────────────┘
-
-Some pages ("foo" and "bar") share the same content structure -
-two vertically stacked boxes:
-
-.. code-block:: text
-
- ┌─── page layout ─────────────────────┐
- │ │
- │ ┌── block "content" ──┐ │
- │ │ ┌─ block "top" ───┐ │ │
- │ │ │ │ │ │
- │ │ └─────────────────┘ │ │
- │ │ ┌─ block "bottom" ┐ │ │
- │ │ │ │ │ │
- │ │ └─────────────────┘ │ │
- │ └─────────────────────┘ │
- │ │
- └─────────────────────────────────────┘
-
-While other pages ("boom" and "baz") share a different content structure -
-two boxes side by side:
-
-.. code-block:: text
-
- ┌─── page layout ─────────────────────┐
- │ │
- │ ┌── block "content" ──┐ │
- │ │ │ │
- │ │ ┌ block ┐ ┌ block ┐ │ │
- │ │ │"left" │ │"right"│ │ │
- │ │ │ │ │ │ │ │
- │ │ │ │ │ │ │ │
- │ │ └───────┘ └───────┘ │ │
- │ └─────────────────────┘ │
- │ │
- └─────────────────────────────────────┘
-
-Without the ``embed`` tag, you have two ways to design your templates:
-
- * Create two "intermediate" base templates that extend the master layout
- template: one with vertically stacked boxes to be used by the "foo" and
- "bar" pages and another one with side-by-side boxes for the "boom" and
- "baz" pages.
-
- * Embed the markup for the top/bottom and left/right boxes into each page
- template directly.
-
-These two solutions do not scale well because they each have a major drawback:
-
- * The first solution may indeed work for this simplified example. But imagine
- we add a sidebar, which may again contain different, recurring structures
- of content. Now we would need to create intermediate base templates for
- all occurring combinations of content structure and sidebar structure...
- and so on.
-
- * The second solution involves duplication of common code with all its negative
- consequences: any change involves finding and editing all affected copies
- of the structure, correctness has to be verified for each copy, copies may
- go out of sync by careless modifications etc.
-
-In such a situation, the ``embed`` tag comes in handy. The common layout
-code can live in a single base template, and the two different content structures,
-let's call them "micro layouts" go into separate templates which are embedded
-as necessary:
-
-Page template ``foo.twig``:
-
-.. code-block:: jinja
-
- {% extends "layout_skeleton.twig" %}
-
- {% block content %}
- {% embed "vertical_boxes_skeleton.twig" %}
- {% block top %}
- Some content for the top box
- {% endblock %}
-
- {% block bottom %}
- Some content for the bottom box
- {% endblock %}
- {% endembed %}
- {% endblock %}
-
-And here is the code for ``vertical_boxes_skeleton.twig``:
-
-.. code-block:: html+jinja
-
-
- {% block top %}
- Top box default content
- {% endblock %}
-
-
-The goal of the ``vertical_boxes_skeleton.twig`` template being to factor
-out the HTML markup for the boxes.
-
-The ``embed`` tag takes the exact same arguments as the ``include`` tag:
-
-.. code-block:: jinja
-
- {% embed "base" with {'foo': 'bar'} %}
- ...
- {% endembed %}
-
- {% embed "base" with {'foo': 'bar'} only %}
- ...
- {% endembed %}
-
- {% embed "base" ignore missing %}
- ...
- {% endembed %}
-
-.. warning::
-
- As embedded templates do not have "names", auto-escaping strategies based
- on the template "filename" won't work as expected if you change the
- context (for instance, if you embed a CSS/JavaScript template into an HTML
- one). In that case, explicitly set the default auto-escaping strategy with
- the ``autoescape`` tag.
-
-.. seealso:: :doc:`include<../tags/include>`
diff --git a/plugins/twig/vendor/twig/twig/doc/tags/extends.rst b/plugins/twig/vendor/twig/twig/doc/tags/extends.rst
deleted file mode 100644
index 1ad2b12b..00000000
--- a/plugins/twig/vendor/twig/twig/doc/tags/extends.rst
+++ /dev/null
@@ -1,268 +0,0 @@
-``extends``
-===========
-
-The ``extends`` tag can be used to extend a template from another one.
-
-.. note::
-
- Like PHP, Twig does not support multiple inheritance. So you can only have
- one extends tag called per rendering. However, Twig supports horizontal
- :doc:`reuse
', 1)));
- $node = new Twig_Node_Spaceless($body, 1);
-
- $this->assertEquals($body, $node->getNode('body'));
- }
-
- public function getTests()
- {
- $body = new Twig_Node(array(new Twig_Node_Text('