Full Code of mbosecke/pebble for AI

master 37f69de6df9f cached
788 files
1.4 MB
370.2k tokens
2946 symbols
1 requests
Download .txt
Showing preview only (1,654K chars total). Download the full file or copy to clipboard to get everything.
Repository: mbosecke/pebble
Branch: master
Commit: 37f69de6df9f
Files: 788
Total size: 1.4 MB

Directory structure:
gitextract_382czipv/

├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   └── issue.md
│   ├── dependabot.yml
│   └── workflows/
│       └── maven.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docs/
│   ├── pom.xml
│   └── src/
│       └── orchid/
│           └── resources/
│               ├── assets/
│               │   └── css/
│               │       └── github-fork-ribbon.css
│               ├── changelog/
│               │   ├── v3_0_0.md
│               │   ├── v3_0_1.md
│               │   ├── v3_0_10.md
│               │   ├── v3_0_2.md
│               │   ├── v3_0_3.md
│               │   ├── v3_0_4.md
│               │   ├── v3_0_5.md
│               │   ├── v3_0_6.md
│               │   ├── v3_0_7.md
│               │   ├── v3_0_8.md
│               │   ├── v3_0_9.md
│               │   ├── v3_1_0.md
│               │   ├── v3_1_1.md
│               │   ├── v3_1_2.md
│               │   ├── v3_1_3.md
│               │   ├── v3_1_4.md
│               │   ├── v3_1_5.md
│               │   ├── v3_1_6.md
│               │   ├── v3_2_0.md
│               │   ├── v3_2_1.md
│               │   ├── v3_2_2.md
│               │   ├── v3_2_3.md
│               │   ├── v3_2_4.md
│               │   ├── v4_0_0.md
│               │   ├── v4_1_0.md
│               │   └── v4_1_1.md
│               ├── config.yml
│               ├── data/
│               │   ├── contributors.yml
│               │   └── twig-compatibility/
│               │       ├── filters.yml
│               │       ├── functions.yml
│               │       ├── operators.yml
│               │       ├── tags.yml
│               │       └── tests.yml
│               ├── homepage.md
│               ├── pages/
│               │   ├── CNAME
│               │   ├── changelog.md
│               │   ├── contributing.md
│               │   └── twig-compatibility.peb
│               ├── templates/
│               │   ├── includes/
│               │   │   └── sidebar.peb
│               │   └── layouts/
│               │       └── index.peb
│               └── wiki/
│                   ├── filter/
│                   │   ├── abbreviate.md
│                   │   ├── abs.md
│                   │   ├── base64decode.md
│                   │   ├── base64encode.md
│                   │   ├── capitalize.md
│                   │   ├── date.md
│                   │   ├── default.md
│                   │   ├── escape.md
│                   │   ├── first.md
│                   │   ├── format.md
│                   │   ├── join.md
│                   │   ├── last.md
│                   │   ├── length.md
│                   │   ├── lower.md
│                   │   ├── nl2br.md
│                   │   ├── numberformat.md
│                   │   ├── raw.md
│                   │   ├── replace.md
│                   │   ├── reverse.md
│                   │   ├── rsort.md
│                   │   ├── sha256.md
│                   │   ├── slice.md
│                   │   ├── sort.md
│                   │   ├── split.md
│                   │   ├── title.md
│                   │   ├── trim.md
│                   │   ├── upper.md
│                   │   └── urlencode.md
│                   ├── function/
│                   │   ├── blockFunction.md
│                   │   ├── i18n.md
│                   │   ├── max.md
│                   │   ├── min.md
│                   │   ├── parent.md
│                   │   └── range.md
│                   ├── guide/
│                   │   ├── basic-usage.md
│                   │   ├── customize-defaults.md
│                   │   ├── escaping.md
│                   │   ├── extending-pebble.md
│                   │   ├── high-performance.md
│                   │   ├── installation.md
│                   │   └── spring-boot-integration.md
│                   ├── operator/
│                   │   ├── comparisons.md
│                   │   ├── contains.md
│                   │   ├── is.md
│                   │   ├── logic.md
│                   │   ├── math.md
│                   │   └── others.md
│                   ├── summary.md
│                   ├── tag/
│                   │   ├── autoescape.md
│                   │   ├── block.md
│                   │   ├── cache.md
│                   │   ├── embed.md
│                   │   ├── extends.md
│                   │   ├── filter.md
│                   │   ├── flush.md
│                   │   ├── for.md
│                   │   ├── from.md
│                   │   ├── if.md
│                   │   ├── import.md
│                   │   ├── include.md
│                   │   ├── macro.md
│                   │   ├── parallel.md
│                   │   ├── set.md
│                   │   └── verbatim.md
│                   └── test/
│                       ├── empty.md
│                       ├── even.md
│                       ├── iterable.md
│                       ├── map.md
│                       ├── null.md
│                       └── odd.md
├── intellij-java-google-style.xml
├── pebble/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── io/
│       │           └── pebbletemplates/
│       │               └── pebble/
│       │                   ├── PebbleEngine.java
│       │                   ├── attributes/
│       │                   │   ├── ArrayResolver.java
│       │                   │   ├── AttributeResolver.java
│       │                   │   ├── DefaultAttributeResolver.java
│       │                   │   ├── ListResolver.java
│       │                   │   ├── MacroResolver.java
│       │                   │   ├── MapResolver.java
│       │                   │   ├── MemberCacheUtils.java
│       │                   │   ├── ResolvedAttribute.java
│       │                   │   └── methodaccess/
│       │                   │       ├── BlacklistMethodAccessValidator.java
│       │                   │       ├── MethodAccessValidator.java
│       │                   │       └── NoOpMethodAccessValidator.java
│       │                   ├── cache/
│       │                   │   ├── CacheKey.java
│       │                   │   ├── PebbleCache.java
│       │                   │   ├── tag/
│       │                   │   │   ├── CaffeineTagCache.java
│       │                   │   │   ├── ConcurrentMapTagCache.java
│       │                   │   │   └── NoOpTagCache.java
│       │                   │   └── template/
│       │                   │       ├── CaffeineTemplateCache.java
│       │                   │       ├── ConcurrentMapTemplateCache.java
│       │                   │       └── NoOpTemplateCache.java
│       │                   ├── error/
│       │                   │   ├── AttributeNotFoundException.java
│       │                   │   ├── ClassAccessException.java
│       │                   │   ├── LoaderException.java
│       │                   │   ├── ParserException.java
│       │                   │   ├── PebbleException.java
│       │                   │   └── RootAttributeNotFoundException.java
│       │                   ├── extension/
│       │                   │   ├── AbstractExtension.java
│       │                   │   ├── AbstractNodeVisitor.java
│       │                   │   ├── Extension.java
│       │                   │   ├── ExtensionCustomizer.java
│       │                   │   ├── ExtensionRegistry.java
│       │                   │   ├── ExtensionRegistryFactory.java
│       │                   │   ├── Filter.java
│       │                   │   ├── Function.java
│       │                   │   ├── NamedArguments.java
│       │                   │   ├── NodeVisitor.java
│       │                   │   ├── NodeVisitorFactory.java
│       │                   │   ├── Test.java
│       │                   │   ├── core/
│       │                   │   │   ├── AbbreviateFilter.java
│       │                   │   │   ├── AbsFilter.java
│       │                   │   │   ├── AttributeResolverExtension.java
│       │                   │   │   ├── Base64DecoderFilter.java
│       │                   │   │   ├── Base64EncoderFilter.java
│       │                   │   │   ├── CapitalizeFilter.java
│       │                   │   │   ├── CoreExtension.java
│       │                   │   │   ├── DateFilter.java
│       │                   │   │   ├── DefaultFilter.java
│       │                   │   │   ├── DefinedTest.java
│       │                   │   │   ├── DisallowExtensionCustomizerBuilder.java
│       │                   │   │   ├── EmptyTest.java
│       │                   │   │   ├── EvenTest.java
│       │                   │   │   ├── FirstFilter.java
│       │                   │   │   ├── FormatFilter.java
│       │                   │   │   ├── IterableTest.java
│       │                   │   │   ├── JoinFilter.java
│       │                   │   │   ├── LastFilter.java
│       │                   │   │   ├── LengthFilter.java
│       │                   │   │   ├── LowerFilter.java
│       │                   │   │   ├── MacroAndBlockRegistrantNodeVisitor.java
│       │                   │   │   ├── MacroAndBlockRegistrantNodeVisitorFactory.java
│       │                   │   │   ├── MapTest.java
│       │                   │   │   ├── MaxFunction.java
│       │                   │   │   ├── MergeFilter.java
│       │                   │   │   ├── MinFunction.java
│       │                   │   │   ├── Nl2brFilter.java
│       │                   │   │   ├── NullTest.java
│       │                   │   │   ├── NumberFormatFilter.java
│       │                   │   │   ├── OddTest.java
│       │                   │   │   ├── RangeFunction.java
│       │                   │   │   ├── ReplaceFilter.java
│       │                   │   │   ├── ReverseFilter.java
│       │                   │   │   ├── RsortFilter.java
│       │                   │   │   ├── Sha256Filter.java
│       │                   │   │   ├── SliceFilter.java
│       │                   │   │   ├── SortFilter.java
│       │                   │   │   ├── SplitFilter.java
│       │                   │   │   ├── TitleFilter.java
│       │                   │   │   ├── TrimFilter.java
│       │                   │   │   ├── UpperFilter.java
│       │                   │   │   └── UrlEncoderFilter.java
│       │                   │   ├── debug/
│       │                   │   │   ├── DebugExtension.java
│       │                   │   │   ├── PrettyPrintNodeVisitor.java
│       │                   │   │   └── PrettyPrintNodeVisitorFactory.java
│       │                   │   ├── escaper/
│       │                   │   │   ├── EscapeFilter.java
│       │                   │   │   ├── EscaperExtension.java
│       │                   │   │   ├── EscaperNodeVisitor.java
│       │                   │   │   ├── EscaperNodeVisitorFactory.java
│       │                   │   │   ├── EscapingStrategy.java
│       │                   │   │   ├── RawFilter.java
│       │                   │   │   └── SafeString.java
│       │                   │   ├── i18n/
│       │                   │   │   ├── I18nExtension.java
│       │                   │   │   ├── UTF8Control.java
│       │                   │   │   └── i18nFunction.java
│       │                   │   └── writer/
│       │                   │       ├── PooledSpecializedStringWriter.java
│       │                   │       ├── SpecializedWriter.java
│       │                   │       └── StringWriterSpecializedAdapter.java
│       │                   ├── lexer/
│       │                   │   ├── Lexer.java
│       │                   │   ├── LexerImpl.java
│       │                   │   ├── Syntax.java
│       │                   │   ├── TemplateSource.java
│       │                   │   ├── Token.java
│       │                   │   └── TokenStream.java
│       │                   ├── loader/
│       │                   │   ├── AbstractServletLoader.java
│       │                   │   ├── ClasspathLoader.java
│       │                   │   ├── DelegatingLoader.java
│       │                   │   ├── DelegatingLoaderCacheKey.java
│       │                   │   ├── FileLoader.java
│       │                   │   ├── Loader.java
│       │                   │   ├── MemoryLoader.java
│       │                   │   ├── Servlet5Loader.java
│       │                   │   ├── ServletLoader.java
│       │                   │   └── StringLoader.java
│       │                   ├── node/
│       │                   │   ├── AbstractRenderableNode.java
│       │                   │   ├── ArgumentsNode.java
│       │                   │   ├── AutoEscapeNode.java
│       │                   │   ├── BlockNode.java
│       │                   │   ├── BodyNode.java
│       │                   │   ├── CacheNode.java
│       │                   │   ├── EmbedNode.java
│       │                   │   ├── ExtendsNode.java
│       │                   │   ├── FlushNode.java
│       │                   │   ├── ForNode.java
│       │                   │   ├── FromNode.java
│       │                   │   ├── FunctionOrMacroNameNode.java
│       │                   │   ├── IfNode.java
│       │                   │   ├── ImportNode.java
│       │                   │   ├── IncludeNode.java
│       │                   │   ├── MacroNode.java
│       │                   │   ├── NamedArgumentNode.java
│       │                   │   ├── Node.java
│       │                   │   ├── ParallelNode.java
│       │                   │   ├── PositionalArgumentNode.java
│       │                   │   ├── PrintNode.java
│       │                   │   ├── RenderableNode.java
│       │                   │   ├── RootNode.java
│       │                   │   ├── SetNode.java
│       │                   │   ├── TestInvocationExpression.java
│       │                   │   ├── TextNode.java
│       │                   │   ├── expression/
│       │                   │   │   ├── AddExpression.java
│       │                   │   │   ├── AndExpression.java
│       │                   │   │   ├── ArrayExpression.java
│       │                   │   │   ├── BinaryExpression.java
│       │                   │   │   ├── BlockFunctionExpression.java
│       │                   │   │   ├── ConcatenateExpression.java
│       │                   │   │   ├── ContainsExpression.java
│       │                   │   │   ├── ContextVariableExpression.java
│       │                   │   │   ├── DivideExpression.java
│       │                   │   │   ├── EqualsExpression.java
│       │                   │   │   ├── Expression.java
│       │                   │   │   ├── FilterExpression.java
│       │                   │   │   ├── FilterInvocationExpression.java
│       │                   │   │   ├── FunctionOrMacroInvocationExpression.java
│       │                   │   │   ├── GetAttributeExpression.java
│       │                   │   │   ├── GreaterThanEqualsExpression.java
│       │                   │   │   ├── GreaterThanExpression.java
│       │                   │   │   ├── LessThanEqualsExpression.java
│       │                   │   │   ├── LessThanExpression.java
│       │                   │   │   ├── LiteralBigDecimalExpression.java
│       │                   │   │   ├── LiteralBooleanExpression.java
│       │                   │   │   ├── LiteralDoubleExpression.java
│       │                   │   │   ├── LiteralIntegerExpression.java
│       │                   │   │   ├── LiteralLongExpression.java
│       │                   │   │   ├── LiteralNullExpression.java
│       │                   │   │   ├── LiteralStringExpression.java
│       │                   │   │   ├── MapExpression.java
│       │                   │   │   ├── ModulusExpression.java
│       │                   │   │   ├── MultiplyExpression.java
│       │                   │   │   ├── NegativeTestExpression.java
│       │                   │   │   ├── NotEqualsExpression.java
│       │                   │   │   ├── OrExpression.java
│       │                   │   │   ├── ParentFunctionExpression.java
│       │                   │   │   ├── PositiveTestExpression.java
│       │                   │   │   ├── RangeExpression.java
│       │                   │   │   ├── RenderableNodeExpression.java
│       │                   │   │   ├── SubtractExpression.java
│       │                   │   │   ├── TernaryExpression.java
│       │                   │   │   ├── UnaryExpression.java
│       │                   │   │   ├── UnaryMinusExpression.java
│       │                   │   │   ├── UnaryNotExpression.java
│       │                   │   │   └── UnaryPlusExpression.java
│       │                   │   └── fornode/
│       │                   │       ├── LazyLength.java
│       │                   │       └── LazyRevIndex.java
│       │                   ├── operator/
│       │                   │   ├── Associativity.java
│       │                   │   ├── BinaryOperator.java
│       │                   │   ├── BinaryOperatorImpl.java
│       │                   │   ├── BinaryOperatorType.java
│       │                   │   ├── UnaryOperator.java
│       │                   │   └── UnaryOperatorImpl.java
│       │                   ├── parser/
│       │                   │   ├── ExpressionParser.java
│       │                   │   ├── Parser.java
│       │                   │   ├── ParserImpl.java
│       │                   │   ├── ParserOptions.java
│       │                   │   └── StoppingCondition.java
│       │                   ├── template/
│       │                   │   ├── Block.java
│       │                   │   ├── EvaluationContext.java
│       │                   │   ├── EvaluationContextImpl.java
│       │                   │   ├── EvaluationOptions.java
│       │                   │   ├── GlobalContext.java
│       │                   │   ├── Hierarchy.java
│       │                   │   ├── Macro.java
│       │                   │   ├── MacroAttributeProvider.java
│       │                   │   ├── PebbleTemplate.java
│       │                   │   ├── PebbleTemplateImpl.java
│       │                   │   ├── RenderedSizeContext.java
│       │                   │   ├── Scope.java
│       │                   │   └── ScopeChain.java
│       │                   ├── tokenParser/
│       │                   │   ├── AutoEscapeTokenParser.java
│       │                   │   ├── BlockTokenParser.java
│       │                   │   ├── CacheTokenParser.java
│       │                   │   ├── EmbedTokenParser.java
│       │                   │   ├── ExtendsTokenParser.java
│       │                   │   ├── FilterTokenParser.java
│       │                   │   ├── FlushTokenParser.java
│       │                   │   ├── ForTokenParser.java
│       │                   │   ├── FromTokenParser.java
│       │                   │   ├── IfTokenParser.java
│       │                   │   ├── ImportTokenParser.java
│       │                   │   ├── IncludeTokenParser.java
│       │                   │   ├── MacroTokenParser.java
│       │                   │   ├── ParallelTokenParser.java
│       │                   │   ├── SetTokenParser.java
│       │                   │   ├── TokenParser.java
│       │                   │   └── VerbatimTokenParser.java
│       │                   └── utils/
│       │                       ├── Callbacks.java
│       │                       ├── FutureWriter.java
│       │                       ├── LimitedSizeWriter.java
│       │                       ├── OperatorUtils.java
│       │                       ├── Pair.java
│       │                       ├── PathUtils.java
│       │                       ├── StringLengthComparator.java
│       │                       ├── StringUtils.java
│       │                       └── TypeUtils.java
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── pebbletemplates/
│           │           └── pebble/
│           │               ├── ArgumentsNodeTest.java
│           │               ├── ArraySyntaxTest.java
│           │               ├── AttributeSubscriptSyntaxTest.java
│           │               ├── CacheTest.java
│           │               ├── CompilerTest.java
│           │               ├── ConcurrencyTest.java
│           │               ├── ContextTest.java
│           │               ├── CoreFiltersTest.java
│           │               ├── CoreFunctionsTest.java
│           │               ├── CoreTagsTest.java
│           │               ├── CoreTestsTest.java
│           │               ├── DynamicNamedArgsTest.java
│           │               ├── EmbedCachingTagTest.java
│           │               ├── EmbedTagTest.java
│           │               ├── EnumEqualsTest.java
│           │               ├── ErrorReportingTest.java
│           │               ├── EscaperExtensionTest.java
│           │               ├── ExtendingPebbleTest.java
│           │               ├── FileLoaderTest.java
│           │               ├── ForTest.java
│           │               ├── GetAttributeTest.java
│           │               ├── I18nExtensionTest.java
│           │               ├── IncludeWithParameterTest.java
│           │               ├── InheritanceTest.java
│           │               ├── LoaderTest.java
│           │               ├── LogicTest.java
│           │               ├── MacroTest.java
│           │               ├── MapSyntaxTest.java
│           │               ├── MaxRenderedSizeTest.java
│           │               ├── MethodAccessTemplateTest.java
│           │               ├── NewlineTrimmingTest.java
│           │               ├── Nl2brFilterTest.java
│           │               ├── OverloadedMethodTest.java
│           │               ├── OverrideCoreExtensionTest.java
│           │               ├── ParsingOdditiesTest.java
│           │               ├── RenderSingleBlockTest.java
│           │               ├── RenderWithoutEndBlockTest.java
│           │               ├── ScopeChainTest.java
│           │               ├── ScopeTest.java
│           │               ├── SplitFilterTest.java
│           │               ├── StrictModeTest.java
│           │               ├── StringInterpolationTest.java
│           │               ├── TernaryExpressionTest.java
│           │               ├── TestParallelParsing.java
│           │               ├── TestRelativePath.java
│           │               ├── WhitespaceControlTest.java
│           │               ├── WritingTest.java
│           │               ├── attributes/
│           │               │   └── methodaccess/
│           │               │       ├── BlacklistMethodAccessValidatorTest.java
│           │               │       ├── Foo.java
│           │               │       ├── InstanceProvider.java
│           │               │       ├── MethodsProvider.java
│           │               │       └── NoOpMethodAccessValidatorTest.java
│           │               ├── extension/
│           │               │   ├── ArrayToStringFilter.java
│           │               │   ├── ExtensionCustomizerTest.java
│           │               │   ├── InvocationCountingFunction.java
│           │               │   ├── ListToStringFilter.java
│           │               │   ├── MapToStringFilter.java
│           │               │   ├── TestingExtension.java
│           │               │   ├── core/
│           │               │   │   └── FormatFilterTest.java
│           │               │   └── escaper/
│           │               │       └── RawFilterTest.java
│           │               ├── lexer/
│           │               │   ├── IdentifierTest.java
│           │               │   ├── LexerImplTest.java
│           │               │   └── SyntaxTest.java
│           │               ├── macro/
│           │               │   ├── MacroGlobalVariablesTest.java
│           │               │   ├── PebbleExtension.java
│           │               │   ├── TestFilter.java
│           │               │   └── TestMacroCalls.java
│           │               ├── node/
│           │               │   ├── ForNodeTest.java
│           │               │   ├── IfNodeTest.java
│           │               │   └── expression/
│           │               │       ├── AndExpressionTest.java
│           │               │       ├── ExpressionTest.java
│           │               │       ├── OrExpressionTest.java
│           │               │       ├── StringExpressionParserTest.java
│           │               │       └── UnaryNotExpressionTest.java
│           │               ├── template/
│           │               │   └── tests/
│           │               │       ├── PebbleTestContext.java
│           │               │       ├── WhiteSpaceControlWithNewLineTrimmingTests.java
│           │               │       └── input/
│           │               │           ├── PebbleTestItem.java
│           │               │           └── PebbleTestItemType.java
│           │               └── utils/
│           │                   ├── LimitedSizeWriterTest.java
│           │                   ├── OperatorUtilsToNumberTest.java
│           │                   └── PathUtilsTest.java
│           └── resources/
│               ├── logback-test.xml
│               ├── security/
│               │   ├── allowedMethods.properties
│               │   └── unsafeMethods.properties
│               ├── template-tests/
│               │   ├── DoubleNestedIfStatement.peb
│               │   ├── DoubleNestedIfStatement.txt
│               │   ├── ForLoopWithNestedIfStatementAndMacro.peb
│               │   ├── ForLoopWithNestedIfStatementAndMacro.txt
│               │   ├── NestedIfStatementWithOneElseIfStatements.peb
│               │   ├── NestedIfStatementWithOneElseIfStatements.txt
│               │   ├── NestedIfStatementWithThreeElseIfStatements.peb
│               │   ├── NestedIfStatementWithThreeElseIfStatements.txt
│               │   ├── NestedIfStatementWithTwoElseIfStatements.peb
│               │   └── NestedIfStatementWithTwoElseIfStatements.txt
│               ├── templates/
│               │   ├── cache/
│               │   │   ├── cache1/
│               │   │   │   └── template.cache.peb
│               │   │   ├── cache2/
│               │   │   │   └── template.cache.peb
│               │   │   ├── template.cacheChild.peb
│               │   │   └── template.cacheParent.peb
│               │   ├── embed/
│               │   │   ├── cache/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template1.peb
│               │   │   │   └── template2.peb
│               │   │   ├── notes.md
│               │   │   ├── test0/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test1/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test10/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test11/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test12/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test13/
│               │   │   │   ├── template.embedbase.1.peb
│               │   │   │   ├── template.embedbase.2.peb
│               │   │   │   ├── template.embedbase.3.peb
│               │   │   │   ├── template.extendsbase.1.peb
│               │   │   │   ├── template.extendsbase.2.peb
│               │   │   │   ├── template.extendsbase.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test14/
│               │   │   │   ├── template.embedbase.1.peb
│               │   │   │   ├── template.extendsbase.1.peb
│               │   │   │   ├── template.extendsbase.2.peb
│               │   │   │   ├── template.extendsbase.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test15/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test16/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test17/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test18/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test2/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   └── template.result.txt
│               │   │   ├── test3/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   └── template.result.txt
│               │   │   ├── test4/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test5/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test6/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test7/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test8/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   └── test9/
│               │   │       ├── template.base.1.peb
│               │   │       ├── template.base.2.peb
│               │   │       ├── template.base.3.peb
│               │   │       ├── template.peb
│               │   │       ├── template.result.twig.txt
│               │   │       └── template.result.txt
│               │   ├── function/
│               │   │   ├── template.block.peb
│               │   │   ├── template.child.peb
│               │   │   ├── template.childThenParentThenMacro.peb
│               │   │   ├── template.childWithContext.peb
│               │   │   ├── template.parent.peb
│               │   │   ├── template.parentAccessContext.peb
│               │   │   ├── template.parentThenMacro.peb
│               │   │   └── template.subchild.peb
│               │   ├── loader/
│               │   │   └── template.loaderTest.peb
│               │   ├── macros/
│               │   │   ├── from.peb
│               │   │   ├── import.as.peb
│               │   │   ├── include.peb
│               │   │   ├── index.peb
│               │   │   ├── invalid.from.peb
│               │   │   ├── invalid.from.sameAlias.peb
│               │   │   ├── invalid.from.unknownMacro.peb
│               │   │   ├── invalid.import.as.sameAlias.peb
│               │   │   ├── invalid.macro.peb
│               │   │   ├── macro.peb
│               │   │   ├── setVariableBase.peb
│               │   │   └── setVariableMacro.peb
│               │   ├── relativepath/
│               │   │   ├── subdirectory1/
│               │   │   │   ├── template.backwardslashes.peb
│               │   │   │   └── template.forwardslashes.peb
│               │   │   ├── subdirectory2/
│               │   │   │   └── template.relativeinclude2.peb
│               │   │   ├── template.relativeextends1.peb
│               │   │   ├── template.relativeextends2.peb
│               │   │   ├── template.relativeimport1.peb
│               │   │   ├── template.relativeimport2.peb
│               │   │   ├── template.relativeinclude1.peb
│               │   │   └── template.relativeinclude2.peb
│               │   ├── single-block/
│               │   │   ├── template.renderextendedblock1.peb
│               │   │   └── template.renderextendedblock2.peb
│               │   ├── template.autoescapeInclude1.peb
│               │   ├── template.autoescapeInclude2.peb
│               │   ├── template.autoescapeParent1.peb
│               │   ├── template.autoescapeParent2.peb
│               │   ├── template.child.peb
│               │   ├── template.concurrent1.peb
│               │   ├── template.concurrent2.peb
│               │   ├── template.dynamicChild.peb
│               │   ├── template.dynamicParent1.peb
│               │   ├── template.dynamicParent2.peb
│               │   ├── template.errorReporting.peb
│               │   ├── template.escapeCharactersInText.peb
│               │   ├── template.general.peb
│               │   ├── template.grandfather.peb
│               │   ├── template.import.dynamic.macro_ajax.peb
│               │   ├── template.import.dynamic.macro_classic.peb
│               │   ├── template.import.dynamic.peb
│               │   ├── template.importWithinBlock.peb
│               │   ├── template.include.dynamic.adminFooter.peb
│               │   ├── template.include.dynamic.defaultFooter.peb
│               │   ├── template.include.dynamic.peb
│               │   ├── template.include1.peb
│               │   ├── template.include2.peb
│               │   ├── template.includeInheritance1.peb
│               │   ├── template.includeInheritance2.peb
│               │   ├── template.includeInheritance3.peb
│               │   ├── template.includeOverrideBlock.peb
│               │   ├── template.includeOverrideBlock2.peb
│               │   ├── template.includeOverrideVariable1.peb
│               │   ├── template.includeOverrideVariable2.peb
│               │   ├── template.includePropagatesContext.peb
│               │   ├── template.includePropagatesContext2.peb
│               │   ├── template.includeWithParameter1.peb
│               │   ├── template.includeWithParameter2.peb
│               │   ├── template.includeWithParameterNotIsolated1.peb
│               │   ├── template.includeWithParameterNotIsolated2.peb
│               │   ├── template.includeWithParameterObject1.peb
│               │   ├── template.includeWithParameterObject2.peb
│               │   ├── template.includeWithinBlock.peb
│               │   ├── template.loaderTest.peb
│               │   ├── template.loaderTest.peb.suffix
│               │   ├── template.macro.child.peb
│               │   ├── template.macro.exploding.peb
│               │   ├── template.macro.parent.peb
│               │   ├── template.macro1.peb
│               │   ├── template.macro2.peb
│               │   ├── template.macro3.peb
│               │   ├── template.macroDouble.peb
│               │   ├── template.parallelInclude1.peb
│               │   ├── template.parallelInclude2.peb
│               │   ├── template.parallelParsing1.peb
│               │   ├── template.parallelParsing2.peb
│               │   ├── template.parallelWithImport.peb
│               │   ├── template.parallelWithImport2.peb
│               │   ├── template.parent.peb
│               │   ├── template.parent2.peb
│               │   ├── template.set.child.peb
│               │   ├── template.set.parent.peb
│               │   ├── template.skipGenerationBlock1.peb
│               │   ├── template.skipGenerationBlock2.peb
│               │   ├── template.skipGenerationBlock3.peb
│               │   ├── template.skipGenerationMacro1.peb
│               │   ├── template.skipGenerationMacro2.peb
│               │   ├── template.skipGenerationMacro3.peb
│               │   ├── template.strictModeComplexExpression.peb
│               │   └── template.strictModeSimpleExpression.peb
│               ├── testMessages.properties
│               └── testMessages_es_US.properties
├── pebble-spring/
│   ├── pebble-legacy-spring-boot-starter/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── io/
│   │       │   │       └── pebbletemplates/
│   │       │   │           └── boot/
│   │       │   │               └── autoconfigure/
│   │       │   │                   ├── AbstractPebbleConfiguration.java
│   │       │   │                   ├── PebbleAutoConfiguration.java
│   │       │   │                   ├── PebbleProperties.java
│   │       │   │                   ├── PebbleReactiveWebConfiguration.java
│   │       │   │                   ├── PebbleServletWebConfiguration.java
│   │       │   │                   ├── PebbleTemplateAvailabilityProvider.java
│   │       │   │                   └── package-info.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           ├── spring/
│   │       │           │   ├── aot.factories
│   │       │           │   └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │           └── spring.factories
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── boot/
│   │           │               ├── AppConfig.java
│   │           │               ├── Application.java
│   │           │               ├── Controllers.java
│   │           │               ├── Foo.java
│   │           │               └── autoconfigure/
│   │           │                   ├── NonWebAppTests.java
│   │           │                   ├── PebbleAutoConfigurationTest.java
│   │           │                   ├── ReactiveAppTest.java
│   │           │                   └── ServletAppTest.java
│   │           └── resources/
│   │               ├── messages.properties
│   │               ├── messages_es.properties
│   │               └── templates/
│   │                   ├── beans.peb
│   │                   ├── contextPath.peb
│   │                   ├── extensions.peb
│   │                   ├── hello.peb
│   │                   ├── index.peb
│   │                   ├── native-image.peb
│   │                   ├── responseObject.peb
│   │                   └── session.peb
│   ├── pebble-spring-boot-starter/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── io/
│   │       │   │       └── pebbletemplates/
│   │       │   │           └── boot/
│   │       │   │               └── autoconfigure/
│   │       │   │                   ├── AbstractPebbleConfiguration.java
│   │       │   │                   ├── PebbleAutoConfiguration.java
│   │       │   │                   ├── PebbleProperties.java
│   │       │   │                   ├── PebbleReactiveWebConfiguration.java
│   │       │   │                   ├── PebbleServletWebConfiguration.java
│   │       │   │                   ├── PebbleTemplateAvailabilityProvider.java
│   │       │   │                   └── package-info.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           ├── spring/
│   │       │           │   ├── aot.factories
│   │       │           │   ├── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │           │   ├── org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebFlux.imports
│   │       │           │   └── org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureWebMvc.imports
│   │       │           └── spring.factories
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── boot/
│   │           │               ├── AppConfig.java
│   │           │               ├── Application.java
│   │           │               ├── Controllers.java
│   │           │               ├── Foo.java
│   │           │               └── autoconfigure/
│   │           │                   ├── NonWebAppTests.java
│   │           │                   ├── PebbleAutoConfigurationTest.java
│   │           │                   ├── ReactiveAppTest.java
│   │           │                   └── ServletAppTest.java
│   │           └── resources/
│   │               ├── messages.properties
│   │               ├── messages_es.properties
│   │               └── templates/
│   │                   ├── beans.peb
│   │                   ├── contextPath.peb
│   │                   ├── extensions.peb
│   │                   ├── hello.peb
│   │                   ├── index.peb
│   │                   ├── native-image.peb
│   │                   ├── responseObject.peb
│   │                   └── session.peb
│   ├── pebble-spring6/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── io/
│   │       │           └── pebbletemplates/
│   │       │               └── spring/
│   │       │                   ├── context/
│   │       │                   │   └── Beans.java
│   │       │                   ├── extension/
│   │       │                   │   ├── SpringExtension.java
│   │       │                   │   └── function/
│   │       │                   │       ├── HrefFunction.java
│   │       │                   │       ├── MessageSourceFunction.java
│   │       │                   │       └── bindingresult/
│   │       │                   │           ├── BaseBindingResultFunction.java
│   │       │                   │           ├── GetAllErrorsFunction.java
│   │       │                   │           ├── GetFieldErrorsFunction.java
│   │       │                   │           ├── GetGlobalErrorsFunction.java
│   │       │                   │           ├── HasErrorsFunction.java
│   │       │                   │           ├── HasFieldErrorsFunction.java
│   │       │                   │           └── HasGlobalErrorsFunction.java
│   │       │                   ├── reactive/
│   │       │                   │   ├── PebbleReactiveView.java
│   │       │                   │   └── PebbleReactiveViewResolver.java
│   │       │                   └── servlet/
│   │       │                       ├── PebbleView.java
│   │       │                       └── PebbleViewResolver.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── spring/
│   │           │               ├── PebbleViewResolverTest.java
│   │           │               ├── bean/
│   │           │               │   └── SomeBean.java
│   │           │               └── config/
│   │           │                   └── MVCConfig.java
│   │           └── resources/
│   │               └── io/
│   │                   └── pebbletemplates/
│   │                       └── spring/
│   │                           ├── expectedResponse/
│   │                           │   ├── beansTest.html
│   │                           │   ├── bindingResultTest.html
│   │                           │   ├── bindingResultWithMacroTest.html
│   │                           │   ├── hrefFunctionTest.html
│   │                           │   ├── messageEnTest.html
│   │                           │   ├── messageFrTest.html
│   │                           │   ├── requestTest.html
│   │                           │   ├── responseTest.html
│   │                           │   └── sessionTest.html
│   │                           ├── messages_en.properties
│   │                           ├── messages_fr.properties
│   │                           └── template/
│   │                               ├── beansTest.html
│   │                               ├── bindingResultTest.html
│   │                               ├── bindingResultWithMacroTest.html
│   │                               ├── hrefFunctionTest.html
│   │                               ├── messageEnTest.html
│   │                               ├── messageFrTest.html
│   │                               ├── requestTest.html
│   │                               ├── responseTest.html
│   │                               └── sessionTest.html
│   ├── pebble-spring7/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── io/
│   │       │           └── pebbletemplates/
│   │       │               └── spring/
│   │       │                   ├── context/
│   │       │                   │   └── Beans.java
│   │       │                   ├── extension/
│   │       │                   │   ├── SpringExtension.java
│   │       │                   │   └── function/
│   │       │                   │       ├── HrefFunction.java
│   │       │                   │       ├── MessageSourceFunction.java
│   │       │                   │       └── bindingresult/
│   │       │                   │           ├── BaseBindingResultFunction.java
│   │       │                   │           ├── GetAllErrorsFunction.java
│   │       │                   │           ├── GetFieldErrorsFunction.java
│   │       │                   │           ├── GetGlobalErrorsFunction.java
│   │       │                   │           ├── HasErrorsFunction.java
│   │       │                   │           ├── HasFieldErrorsFunction.java
│   │       │                   │           └── HasGlobalErrorsFunction.java
│   │       │                   ├── reactive/
│   │       │                   │   ├── PebbleReactiveView.java
│   │       │                   │   └── PebbleReactiveViewResolver.java
│   │       │                   └── servlet/
│   │       │                       ├── PebbleView.java
│   │       │                       └── PebbleViewResolver.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── spring/
│   │           │               ├── PebbleViewResolverTest.java
│   │           │               ├── bean/
│   │           │               │   └── SomeBean.java
│   │           │               └── config/
│   │           │                   └── MVCConfig.java
│   │           └── resources/
│   │               └── io/
│   │                   └── pebbletemplates/
│   │                       └── spring/
│   │                           ├── expectedResponse/
│   │                           │   ├── beansTest.html
│   │                           │   ├── bindingResultTest.html
│   │                           │   ├── bindingResultWithMacroTest.html
│   │                           │   ├── hrefFunctionTest.html
│   │                           │   ├── messageEnTest.html
│   │                           │   ├── messageFrTest.html
│   │                           │   ├── requestTest.html
│   │                           │   ├── responseTest.html
│   │                           │   └── sessionTest.html
│   │                           ├── messages_en.properties
│   │                           ├── messages_fr.properties
│   │                           └── template/
│   │                               ├── beansTest.html
│   │                               ├── bindingResultTest.html
│   │                               ├── bindingResultWithMacroTest.html
│   │                               ├── hrefFunctionTest.html
│   │                               ├── messageEnTest.html
│   │                               ├── messageFrTest.html
│   │                               ├── requestTest.html
│   │                               ├── responseTest.html
│   │                               └── sessionTest.html
│   └── pom.xml
└── pom.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto


================================================
FILE: .github/FUNDING.yml
================================================
buy_me_a_coffee: erbussierel


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Community Support
    url: https://github.com/PebbleTemplates/pebble/discussions
    about: Please ask and answer questions here.

================================================
FILE: .github/ISSUE_TEMPLATE/issue.md
================================================
---
name: General
about: Bugs, enhancements, documentation, tasks.
title: ''
labels: ''
assignees: ''
---

<!--
Thanks for raising an issue. Please take the time to review the following
categories as some of them do not apply here.

🙅 "Please DO NOT Raise an Issue" Cases
- Question
STOP!! Please ask questions about how to use something, or to understand why something isn't
working as you expect it. Please use [Discussion](https://github.com/PebbleTemplates/pebble/discussions)
- Security Vulnerability
STOP!! Please don't raise security vulnerabilities here. Head over to https://github.com/PebbleTemplates/pebble/security to learn how to disclose them responsibly.

🐞 Bug report
Please provide details of the problem, including the version of Pebble that you
are using. If possible, please provide a test case or sample application that reproduces
the problem. This makes it much easier for us to diagnose the problem and to verify that
we have fixed it.

🎁 Enhancement
Please start by describing the problem that you are trying to solve. There may already
be a solution, or there may be a way to solve it that you hadn't considered.

TIP: You can always edit your issue if it isn't formatted correctly.
     See https://guides.github.com/features/mastering-markdown 
-->

================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "maven"
    directories:
      - "/pebble"
      - "/pebble-spring/pebble-spring7"
      - "/pebble-spring/pebble-spring-boot-starter"
    schedule:
      interval: "daily"
    labels:
      - "dependencies"
    commit-message:
      prefix: "chore"
      include: "scope"
    ignore:
      - dependency-name: "javax.servlet:servlet-api"
        update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
      - dependency-name: "jakarta.servlet:jakarta.servlet-api"
        update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
    groups:
      all-dependencies:
        patterns:
          - "*"

  - package-ecosystem: "maven"
    directories:
      - "/pebble-spring/pebble-spring6"
      - "/pebble-spring/pebble-legacy-spring-boot-starter"
    schedule:
      interval: "daily"
    labels:
      - "dependencies"
    commit-message:
      prefix: "chore"
      include: "scope"
    ignore:
      - dependency-name: "jakarta.servlet:jakarta.servlet-api"
        update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
      - dependency-name: "*"
        update-types: ["version-update:semver-major"]
    groups:
      all-dependencies:
        patterns:
          - "*"

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "daily"


================================================
FILE: .github/workflows/maven.yml
================================================
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Build

on:
  push:
    branches: [ "*" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        java-version: [ 17, 21, 25 ]
    steps:
    - uses: actions/checkout@v6
    - name: Set up JDK
      uses: actions/setup-java@v5
      with:
        java-version: ${{ matrix.java-version }}
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven
      run: mvn -B package --file pom.xml

    # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
    #- name: Update dependency graph
    #  uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6


================================================
FILE: .gitignore
================================================
*.class

# Package Files #
*.jar
*.war
*.ear

# Mac OS X
.DS_Store

# Eclipse #
.project
.classpath
.settings/

# IntelliJ
.idea/
*.iml
*.ipr
*.iws

target/
/target
/bin/

.gradle/
build/

*.releaseBackup
release.properties


================================================
FILE: LICENSE
================================================
Copyright (c) 2013, Mitchell Bösecke
All 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.

* Neither the name of the {organization} nor the names of its
  contributors may 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 HOLDER 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.


================================================
FILE: README.md
================================================
# Pebble [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/erbussierel) [![Build](https://github.com/PebbleTemplates/pebble/actions/workflows/maven.yml/badge.svg)](https://github.com/PebbleTemplates/pebble/actions/workflows/maven.yml)

Pebble is a java templating engine inspired by [Twig](https://twig.symfony.com/). It separates itself from the crowd
with its inheritance feature and its easy-to-read syntax. It ships with built-in autoescaping for security, and it
includes integrated support for internationalization.

For more information please visit the [website](https://pebbletemplates.io).

# Breaking changes in version 4.1.x

- If you do not provide a custom Loader, Pebble will now use only a `ClasspathLoader` by default, same as the spring autoconfiguration.
  Before that, it would have used an instance of the `DelegatingLoader` which consists of a `ClasspathLoader` and a `FileLoader` behind the scenes to find your templates.
- Modify the `FileLoader` to use a mandatory base directory parameter.

# Breaking changes in version 4.0.x

- Use one of the following artifactId according to the spring boot version that you are using

| ArtifactId                        | spring-boot version |
|-----------------------------------|---------------------|
| pebble-legacy-spring-boot-starter | 3.x.x               |
| pebble-spring-boot-starter        | 4.x.x               |

- The following spring boot properties has been moved to `.servlet` or `.reactive`

| Old property                    | New Property                            |
|---------------------------------|-----------------------------------------|
| pebble.allowRequestOverride     | pebble.servlet.allowRequestOverride     |
| pebble.allowSessionOverride     | pebble.servlet.allowSessionOverride     |
| pebble.cache                    | pebble.servlet.cache                    |
| pebble.contentType              | pebble.servlet.contentType              |
| pebble.exposeRequestAttributes  | pebble.servlet.exposeRequestAttributes  |
| pebble.exposeSessionAttributes  | pebble.servlet.exposeSessionAttributes  |
| pebble.exposeSpringMacroHelpers | pebble.servlet.exposeSpringMacroHelpers |
|                                 | pebble.reactive.mediaTypes              |

For more information, please consult the spring-boot integration documentation in
the [Boot externalized configuration section](https://pebbletemplates.io/wiki/guide/spring-boot-integration/)

# Breaking changes in version 3.2.x

- Rename package from `com.mitchellbosecke` to `io.pebbletemplates`
- Change default suffix to `.peb` instead of `.pebble` in spring boot autoconfiguration
- Rename method `getInstance` to `createInstance` in `BinaryOperator` interface (#521)

## License

    Copyright (c) 2013, Mitchell Bösecke
    All 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.
    
    * Neither the name of the {organization} nor the names of its
      contributors may 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 HOLDER 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.


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Reporting a Vulnerability

If you think you have found a security vulnerability, please ***DO NOT*** disclose it publicly until we've had a chance to fix it. Please don't report security vulnerabilities using GitHub issues, instead just click on `Report a vulnerability` button on this page to disclose them responsibly. 


================================================
FILE: docs/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>io.pebbletemplates</groupId>
    <artifactId>pebble-project</artifactId>
    <version>4.1.2-SNAPSHOT</version>
  </parent>

  <artifactId>docs</artifactId>
  <packaging>pom</packaging>

  <name>Pebble docs</name>
  <description>Pebble documentation</description>
  <url>http://pebbletemplates.io</url>

  <properties>
    <orchid.version>0.17.4</orchid.version>
  </properties>

  <profiles>
    <profile>
      <id>doc</id>
      <build>
        <plugins>
          <plugin>
            <groupId>io.github.javaeden.orchid</groupId>
            <artifactId>orchid-maven-plugin</artifactId>
            <version>${orchid.version}</version>

            <!-- 1. Include all official Orchid plugins and themes -->
            <dependencies>
              <dependency>
                <groupId>io.github.javaeden.orchid</groupId>
                <artifactId>OrchidDocs</artifactId>
                <version>${orchid.version}</version>
              </dependency>
              <dependency>
                <groupId>io.github.javaeden.orchid</groupId>
                <artifactId>OrchidPluginDocs</artifactId>
                <version>${orchid.version}</version>
              </dependency>
              <dependency>
                <groupId>io.github.javaeden.orchid</groupId>
                <artifactId>OrchidGithub</artifactId>
                <version>${orchid.version}</version>
              </dependency>
            </dependencies>

            <!-- 3. Use the 'BsDoc' theme, and view the site locally at 'http://localhost:8080' -->
            <configuration>
              <theme>Editorial</theme>
              <version>${project.version}</version>
              <baseUrl>https://pebbletemplates.io</baseUrl>
            </configuration>

            <executions>
              <execution>
                <phase>verify</phase>
                <goals>
                  <goal>deploy</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

  <!-- 2. Get Orchid from Jcenter, Bintray, and Jitpack -->
  <pluginRepositories>
    <pluginRepository>
      <id>jcenter</id>
      <url>https://jcenter.bintray.com </url>
    </pluginRepository>
    <pluginRepository>
      <id>kotlinx</id>
      <url>https://kotlin.bintray.com/kotlinx</url>
    </pluginRepository>
  </pluginRepositories>
</project>


================================================
FILE: docs/src/orchid/resources/assets/css/github-fork-ribbon.css
================================================
/*!
 * "Fork me on GitHub" CSS ribbon v0.2.2 | MIT License
 * https://github.com/simonwhitaker/github-fork-ribbon-css
*/

.github-fork-ribbon {
    width: 12.1em;
    height: 12.1em;
    position: absolute;
    overflow: hidden;
    top: 0;
    right: 0;
    z-index: 9999;
    pointer-events: none;
    font-size: 13px;
    text-decoration: none;
    text-indent: -999999px;
    border-bottom: none;
}

.github-fork-ribbon.fixed {
    position: fixed;
}

.github-fork-ribbon:hover, .github-fork-ribbon:active {
    background-color: rgba(0, 0, 0, 0.0);
}

.github-fork-ribbon:before, .github-fork-ribbon:after {
    /* The right and left classes determine the side we attach our banner to */
    position: absolute;
    display: block;
    width: 15.38em;
    height: 1.54em;

    top: 3.23em;
    right: -3.23em;

    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    box-sizing: content-box;

    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    transform: rotate(45deg);
}

.github-fork-ribbon:before {
    content: "";

    /* Add a bit of padding to give some substance outside the "stitching" */
    padding: .38em 0;

    /* Set the base colour */
    background-color: #a00;

    /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */
    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15)));
    background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
    background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
    background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
    background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
    background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));

    /* Add a drop shadow */
    -webkit-box-shadow: 0 .15em .23em 0 rgba(0, 0, 0, 0.5);
    -moz-box-shadow: 0 .15em .23em 0 rgba(0, 0, 0, 0.5);
    box-shadow: 0 .15em .23em 0 rgba(0, 0, 0, 0.5);

    pointer-events: auto;
}

.github-fork-ribbon:after {
    /* Set the text from the data-ribbon attribute */
    content: attr(data-ribbon);

    /* Set the text properties */
    color: #fff;
    font: 700 1em "Helvetica Neue", Helvetica, Arial, sans-serif;
    line-height: 1.54em;
    text-decoration: none;
    text-shadow: 0 -.08em rgba(0, 0, 0, 0.5);
    text-align: center;
    text-indent: 0;

    /* Set the layout properties */
    padding: .15em 0;
    margin: .15em 0;

    /* Add "stitching" effect */
    border-width: .08em 0;
    border-style: dotted;
    border-color: #fff;
    border-color: rgba(255, 255, 255, 0.7);
}

.github-fork-ribbon.left-top, .github-fork-ribbon.left-bottom {
    right: auto;
    left: 0;
}

.github-fork-ribbon.left-bottom, .github-fork-ribbon.right-bottom {
    top: auto;
    bottom: 0;
}

.github-fork-ribbon.left-top:before, .github-fork-ribbon.left-top:after, .github-fork-ribbon.left-bottom:before, .github-fork-ribbon.left-bottom:after {
    right: auto;
    left: -3.23em;
}

.github-fork-ribbon.left-bottom:before, .github-fork-ribbon.left-bottom:after, .github-fork-ribbon.right-bottom:before, .github-fork-ribbon.right-bottom:after {
    top: auto;
    bottom: 3.23em;
}

.github-fork-ribbon.left-top:before, .github-fork-ribbon.left-top:after, .github-fork-ribbon.right-bottom:before, .github-fork-ribbon.right-bottom:after {
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    transform: rotate(-45deg);
}

================================================
FILE: docs/src/orchid/resources/changelog/v3_0_0.md
================================================
---
version: '3.0.0'
---

- Java 8
- Macros have access to all variables within the template and are no longer restricted to a "local scope"
- New signature for filters/functions/tests that accepts the PebbleTemplate, EvaluationContext, and line number
- Converted EvaluationContext to an interface with limited access to the underlying implementation
- A "null" used as a boolean expression now throws an error if strict variables is true, treated as "false" otherwise
- Improved error reporting
- Java8 Date API support on date filter
- Replace guava cache with caffeine
- Add String Interpolation (#235)
- Add the possibility to extend attribute access (#258)
- Remove DynamicAttributeProvider
- Render content on demand. Expose getLiteralTemplate(String templateName) (#295)
- Introduce SpecializedWriter, (#358)
- Many performance enhancements
- Method resolution with overloaded method signatures (#367)
- Use AbstractTemplateViewResolverProperties for spring-boot (#369)

================================================
FILE: docs/src/orchid/resources/changelog/v3_0_1.md
================================================
---
version: '3.0.1'
---

- Macros are restricted to a local scope (#371)
- Macros have access to global attributes via "_context" variable (#242)

================================================
FILE: docs/src/orchid/resources/changelog/v3_0_10.md
================================================
---
version: '3.0.10'
---

- Add support for JDK 9++ (#442, #443)
- Add macro support for errors(BindingResult) in spring extension
- Add spring-petclinic example 


================================================
FILE: docs/src/orchid/resources/changelog/v3_0_2.md
================================================
---
version: '3.0.2'
---

- Add PebbleCache interface and use ConcurrentMap instead of Caffeine as default template/tag cache (#381)
- Use unbescape instead of Coverity Escapers (#380)

================================================
FILE: docs/src/orchid/resources/changelog/v3_0_3.md
================================================
---
version: '3.0.3'
---

- Support more expressions for if operator (#387)
- Consider adding greedyMatchMethod to PebbleProperties (#388)
- Use locale from context for lower/upper filter (#390)
- Restore cache:invalidateAll method (#393)

================================================
FILE: docs/src/orchid/resources/changelog/v3_0_4.md
================================================
---
version: '3.0.4'
---

- Make NOT operator more tolerant to argument type (#394)
- Make ternary if operator more tolerant to argument type (#399)
- Adjust AndExpression and OrExpression logic (#398)
- Add JSON escaping as part of the default escaping strategies (#395)


================================================
FILE: docs/src/orchid/resources/changelog/v3_0_5.md
================================================
---
version: '3.0.5'
---

- Cannot access List methods (#402)
- Implement to boolean smart-casting in OR and AND operators (#405)


================================================
FILE: docs/src/orchid/resources/changelog/v3_0_6.md
================================================
---
version: '3.0.6'
---

- Check that parseNewVariableName() parses a valid identifier (#409) 
- Set up Pebble documentation site using Orchid  (#411)
- Add twig compatibility matrix documentation (#247)


================================================
FILE: docs/src/orchid/resources/changelog/v3_0_7.md
================================================
---
version: '3.0.7'
---

- Add Automatic-Module-Name to support Java 9 modules (#416) 


================================================
FILE: docs/src/orchid/resources/changelog/v3_0_8.md
================================================
---
version: '3.0.8'
---

- Add split filter (#421) 


================================================
FILE: docs/src/orchid/resources/changelog/v3_0_9.md
================================================
---
version: '3.0.9'
---

- Add embed tag (#319, #318, #224, #378, #434)
- Offline documentation (#282, #432)
- Make allowGetClass check case insensitive (#435, #436) 


================================================
FILE: docs/src/orchid/resources/changelog/v3_1_0.md
================================================
---
version: '3.1.0'
---

- **BREAKING CHANGES**: Consider avoiding feature version in spring boot starter name (#459)
- Upgrade spring boot integration to Spring Boot 2.1 (#460)
- Allow override core operators (#455, #456)
- Allows variables to be set in templates when provided context is an immutable map (#453)
- Fixed a few typos in the docs (#452)
- Remove unnecessary variable 'state' in LexerImpl by using Stack (#450)
- Updates Orchid to 0.17.1 and fixes its breaking changes (#448)
- Null value in a Map should not throw AttributeNotFoundException (#447, #446)


================================================
FILE: docs/src/orchid/resources/changelog/v3_1_1.md
================================================
---
version: '3.1.1'
---

- Use a list of unsafeMethods and rename allowGetClass to allowUnsafeMethods (#454)
- PebbleTemplateAvailabilityProvider doesn't find template files from the classpath (#464)
- Added inline verbatim description to Verbatim tag documentation (#422)
- Fix issue of embed tag changing cached templates (#475)
- Fixes bug which allowed sequential String literals to be parsed correctly (#482)
- Update to spring boot 2.2 (486)


================================================
FILE: docs/src/orchid/resources/changelog/v3_1_2.md
================================================
---
version: '3.1.2'
---

- Add support for jdk13 (#487)
- Add basic support for Spring 5 WebFlux reactive in Spring Boot 2 (#333) 


================================================
FILE: docs/src/orchid/resources/changelog/v3_1_3.md
================================================
---
version: '3.1.3'
---

- Allow treating all number literals as BigDecimals to avoid NumberFormatExceptions (#503)
- Custom operator can't use external context (#497) 
- Allow all variable names to be retrieve from ScopeChain/Scope (#291)
- Empty map in strict mode does not throw exception (#491)

================================================
FILE: docs/src/orchid/resources/changelog/v3_1_4.md
================================================
---
version: '3.1.4'
---

- Slice filter: Use collection size when toIndex is greater than collection size  (#504)
- Adjust spring boot doc (#509) 
- Build with jdk14 (#508)
- Set proxyBeanMethods to false and build with spring boot 2.3 (#507)
- Add access to Spring Beans/request/session and response when using Pebble with WebFlux (#512)
- Remove allowUnsafeMethods property and replace it with methodAccessValidator. Default one is BlacklistMethodAccessValidtor (#511)  

================================================
FILE: docs/src/orchid/resources/changelog/v3_1_5.md
================================================
---
version: '3.1.5'
---

- Add timeZone parameter to date filter  (#530)
- Add setting to limit the size of output when evaluating a template  (#529)
- Fix variable name starting with operator  (#541)
- Added Servlet5Loader to support Servlet 5.0 (#549)
- Throw an error when an import alias references an invalid macro (#559)
- Special for loop variables class, to support all attribute resolvers (#560)
- Support all Java identifiers (#544)
- Provide option to customize stock extensions (#552)
- Cannot use sort filter right after split filter (#568)
- Support array of List in sort filter  (#569)
- Extension global variables in macros (#571)
- Add base64 and sha256 filters (#574)

================================================
FILE: docs/src/orchid/resources/changelog/v3_1_6.md
================================================
---
version: '3.1.6'
---

- Make CacheKey class extendible (#604)
- Remove support for spring 1.5.x (#628)
- Fix for older Android versions (#585 #581 #580)

================================================
FILE: docs/src/orchid/resources/changelog/v3_2_0.md
================================================
---
version: '3.2.0'
---

- Add support for spring framework 6 and spring-boot 3 (#630)
- Bump minimum supported java version to 17 in pebble-spring6 and pebble-spring-boot-starter in order to work with
  spring (#630)
- Add a memory loader that supports inheritance and doesn't require a filesystem. This is useful for applications
  that retrieve templates from a database for example (#617).
- **BREAKING CHANGE**: Change default suffix to `.peb` instead of `.pebble` in spring boot autoconfiguration (#553)
- **BREAKING CHANGE**: Rename method `getInstance` to `createInstance` in `BinaryOperator` interface (#521)
- **BREAKING CHANGE**: Rename package from `com.mitchellbosecke` to `io.pebbletemplates` (#635)

================================================
FILE: docs/src/orchid/resources/changelog/v3_2_1.md
================================================
---
version: '3.2.1'
---

- Fix the null pointer exception on the replace filter (#650)
- Add native hints for GraalVM (#648)

================================================
FILE: docs/src/orchid/resources/changelog/v3_2_2.md
================================================
---
version: '3.2.2'
---

- Throw a more detailed exception from DefaultAttributeResolver (#653)
- Make expression nodes fully visitable (#657)
- Added getTemplates function to MemoryLoader (#660)
- Generate OSGi metadata into pebble jar to make it OSGi compliant (#663)
- Add flag for parameter name retention in maven compiler plugin (#664)


================================================
FILE: docs/src/orchid/resources/changelog/v3_2_3.md
================================================
---
version: '3.2.3'
---

- Dynamically open different feature according to different scenarios (#671)
- Fix the ability to provide your own PebbleViewResolver (#686)


================================================
FILE: docs/src/orchid/resources/changelog/v3_2_4.md
================================================
---
version: '3.2.4'
---

- Fix the problem of unit test failure under JDK 21 (#692)
- Fix the problem of not resolving reactive values in models  (#691)


================================================
FILE: docs/src/orchid/resources/changelog/v4_0_0.md
================================================
---
version: '4.0.0'
---

# BREAKING CHANGES
- Add support for spring boot 4 (#704)
- Use one of the following artifactId according to the spring boot version that you are using

| ArtifactId                        | spring-boot version |
|-----------------------------------|---------------------|
| pebble-legacy-spring-boot-starter | 3.x.x               |
| pebble-spring-boot-starter        | 4.x.x               |

- The following spring boot properties has been moved to `.servlet` or `.reactive`

| Old property                    | New Property                            |
|---------------------------------|-----------------------------------------|
| pebble.allowRequestOverride     | pebble.servlet.allowRequestOverride     |
| pebble.allowSessionOverride     | pebble.servlet.allowSessionOverride     |
| pebble.cache                    | pebble.servlet.cache                    |
| pebble.contentType              | pebble.servlet.contentType              |
| pebble.exposeRequestAttributes  | pebble.servlet.exposeRequestAttributes  |
| pebble.exposeSessionAttributes  | pebble.servlet.exposeSessionAttributes  |
| pebble.exposeSpringMacroHelpers | pebble.servlet.exposeSpringMacroHelpers |
|                                 | pebble.reactive.mediaTypes              |

For more information, please consult the spring-boot integration documentation in
the [Boot externalized configuration section](https://pebbletemplates.io/wiki/guide/spring-boot-integration/)

# New Features
- Add nl2br filter (#699)


================================================
FILE: docs/src/orchid/resources/changelog/v4_1_0.md
================================================
---
version: '4.1.0'
---

# BREAKING CHANGES
- If you do not provide a custom Loader, Pebble will now use only a `ClasspathLoader` by default, same as the spring autoconfiguration.
  Before that, it would have used an instance of the `DelegatingLoader` which consists of a `ClasspathLoader` and a `FileLoader` behind the scenes to find your templates.
- Modify the `FileLoader` to use a mandatory base directory parameter.

# Security
- Fix [CVE-2025-1686](https://nvd.nist.gov/vuln/detail/CVE-2025-1686) (#715)

# New Features
- Use a default existing format of `yyyy-MM-dd'T'HH:mm:ssZ` when using date filter with a string (#677)
- Look for exact method / field match when doing reflection. Look for method get/is/has if none match (#712)
- Support dynamic named arguments (#741)

# Bug Fixes
- NaN must return false instead of throwing an exception (#695)

# Dependency Upgrades
- Upgrade to SLF4J 2.0.17 (#709)


================================================
FILE: docs/src/orchid/resources/changelog/v4_1_1.md
================================================
---
version: '4.1.1'
---

# New Features
- Expose AST Root Node to Enable Custom NodeVisitor Implementation (#701)

# Bug Fixes
- Catch all exceptions in DelegatingLoader (#765)


================================================
FILE: docs/src/orchid/resources/config.yml
================================================
site:
  about:
    siteName: 'Pebble Templates'
    subtitle: 'A lightweight but rock solid Java templating engine.'

theme:
  primaryColor: '#72A6D0'
  menu:
    - type: 'separator'
      title: 'About'
    - type: 'page'
      title: 'Home'
      itemId: 'Home'
    - type: 'page'
      itemId: 'Spring Boot Integration'
    - type: 'link'
      title: 'Spring petclinic example'
      url: 'https://github.com/PebbleTemplates/spring-petclinic'
    - type: 'page'
      itemId: 'Twig Compatibility'
    - type: 'page'
      itemId: 'Contributing'
    - type: 'page'
      itemId: 'Changelog'
    - type: 'link'
      title: 'Offline Documentation (PDF)'
      url: '#{$0|baseUrl}/wiki/book.pdf'
    - type: 'link'
      title: 'Buy me a coffee'
      url: 'https://buymeacoffee.com/erbussierel'
    - type: 'separator'
      title: 'Wiki'
    - type: 'wiki'
    - type: 'separator'
      title: 'API Docs'
    - type: 'page'
      title: 'Javadocs'
      itemId: 'io.pebbletemplates'
  extraCss:
    - 'assets/css/pygments.scss'
    - 'assets/css/orchidJavadoc.scss'
    - 'assets/css/github-fork-ribbon.css'

services:
  publications:
    stages:
      - type: githubPages
        branch: gh-pages
        publishType: CleanBranch
        username: PebbleTemplates
        repo: pebble
      - type: githubReleases
        repo: 'PebbleTemplates/pebble'

allPages:
  components:
    - type: 'pageContent'
    - type: 'prism'
      languages:
        - 'java'
        - 'twig'
        - 'markup'

wiki:
  defaultConfig:
    includeIndexInPageTitle: false
    createPdf: true

javadoc:
  sourceDirs:
    - '../../../../pebble/src/main/java'
  pages:
    menu:
      - type: 'javadocPackages'
      - type: 'javadocClasses'

================================================
FILE: docs/src/orchid/resources/data/contributors.yml
================================================
- name: Mitchell Bösecke
  link: https://github.com/mbosecke
- name: Eric Bussieres
  link: https://github.com/ebussieres
- name: Héctor López
  link: https://github.com/hectorlf
- name: Djalma Olivera
  link: https://github.com/djalmaoliveira
- name: Vladimir Loshchin
  link: https://github.com/badbob
- name: yanxiyue
  link: https://github.com/yanxiyue
- name: Vladimir Danilov
  link: https://github.com/diasonti
- name: Casey Brooks
  link: https://github.com/cjbrooks12
- name: Bastien Jansen
  link: https://github.com/bjansen

================================================
FILE: docs/src/orchid/resources/data/twig-compatibility/filters.yml
================================================
- name: 'abs'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/abs.html'
  support: 'full'
  page: 'abs'
- name: 'batch'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/batch.html'
  support: 'none'
- name: 'capitalize'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/capitalize.html'
  support: 'full'
  page: 'capitalize'
- name: 'convert_encoding'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/convert_encoding.html'
  support: 'none'
- name: 'date'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/date.html'
  support: 'partial'
  page: 'date'
  notes: 'This filter uses `java.util.Date` date formatting instead of PHP-style formatting.'
- name: 'date_modify'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/date_modify.html'
  support: 'none'
- name: 'default'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/default.html'
  support: 'full'
  page: 'default'
- name: 'escape'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/escape.html'
  support: 'full'
  page: 'escape'
- name: 'first'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/first.html'
  support: 'full'
  page: 'first'
- name: 'format'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/format.html'
  support: 'full'
  page: 'format'
- name: 'join'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/join.html'
  support: 'none'
  page: 'join'
- name: 'json_encode'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/json_encode.html'
  support: 'none'
- name: 'keys'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/keys.html'
  support: 'none'
- name: 'last'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/last.html'
  support: 'full'
  page: 'last'
- name: 'length'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/length.html'
  support: 'full'
  page: 'length'
- name: 'lower'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/lower.html'
  support: 'full'
  page: 'lower'
- name: 'merge'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/merge.html'
  support: 'none'
- name: 'nl2br'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/nl2br.html'
  support: 'full'
  page: 'nl2br'
- name: 'number_format'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/number_format.html'
  support: 'partial'
  page: 'numberformat'
  notes: 'Filter is named `numberformat`, and uses `java.text.DecimalFormat` formatting instead of PHP-style formatting.'
- name: 'raw'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/raw.html'
  support: 'full'
  page: 'raw'
- name: 'replace'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/replace.html'
  support: 'full'
  page: 'replace'
- name: 'reverse'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/reverse.html'
  support: 'full'
  page: 'reverse'
- name: 'round'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/round.html'
  support: 'none'
- name: 'slice'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/slice.html'
  support: 'full'
  page: 'slice'
- name: 'sort'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/sort.html'
  support: 'full'
  page: 'sort'
- name: 'split'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/split.html'
  support: 'full'
  page: 'split'
- name: 'striptags'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/striptags.html'
  support: 'none'
- name: 'title'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/title.html'
  support: 'full'
  page: 'title'
- name: 'trim'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/trim.html'
  support: 'full'
  page: 'trim'
- name: 'upper'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/upper.html'
  support: 'full'
  page: 'upper'
- name: 'url_encode'
  twigLink: 'https://twig.symfony.com/doc/2.x/filters/url_encode.html'
  support: 'partial'
  page: 'urlencode'
  notes: 'Filter is named `urlencode`.'

================================================
FILE: docs/src/orchid/resources/data/twig-compatibility/functions.yml
================================================
- name: 'attribute'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/attribute.html'
  support: 'none'
- name: 'block'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/block.html'
  support: 'full'
  page: 'block'
- name: 'constant'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/constant.html'
  support: 'none'
- name: 'cycle'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/cycle.html'
  support: 'none'
- name: 'date'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/date.html'
  support: 'none'
- name: 'dump'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/dump.html'
  support: 'none'
- name: 'include'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/include.html'
  support: 'none'
- name: 'max'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/max.html'
  support: 'full'
  page: 'max'
- name: 'min'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/min.html'
  support: 'full'
  page: 'min'
- name: 'parent'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/parent.html'
  support: 'full'
  page: 'parent'
- name: 'random'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/random.html'
  support: 'none'
- name: 'range'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/range.html'
  support: 'full'
  page: 'range'
- name: 'source'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/source.html'
  support: 'none'
- name: 'template_from_string'
  twigLink: 'https://twig.symfony.com/doc/2.x/functions/template_from_string.html'
  support: 'none'


================================================
FILE: docs/src/orchid/resources/data/twig-compatibility/operators.yml
================================================
- name: 'in'
  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#containment-operator'
  support: 'none'
  page: 'contains'
  notes: '`contains` can be used instead'
- name: 'is'
  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#test-operator'
  support: 'full'
  page: 'is'
- name: 'Math (+, -, /, %, //, *, **)'
  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#math'
  support: 'partial'
  page: 'math'
  notes: '`//` and `**` not supported'
- name: 'Logic (and, or, not, (), b-and, b-xor, b-or)'
  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#logic'
  support: 'partial'
  page: 'logic'
  notes: 'Bitwise logical operators are not supported'
- name: 'Comparisons (==, !=, <, >, >=, <=, ===, starts with, ends with, matches)'
  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#comparisons'
  support: 'partial'
  page: 'comparisons'
  notes: '`===`, `starts with`, `ends with`, and `matches` not supported'
- name: 'Others (.., |, ~, ., [], ?:)'
  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#other-operators'
  support: 'full'
  page: 'others'
  notes: 'subscript operator `[]` index starts at 0, not 1'

================================================
FILE: docs/src/orchid/resources/data/twig-compatibility/tags.yml
================================================
- name: 'autoescape'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/autoescape.html'
  support: 'full'
  page: 'autoescape'
- name: 'block'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/block.html'
  support: 'full'
  page: 'block'
- name: 'do'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/do.html'
  support: 'none'
- name: 'embed'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/embed.html'
  support: 'partial'
  page: 'embed'
  notes: '`only` clause and `ignore missing` clause not supported'
- name: 'extends'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/extends.html'
  support: 'full'
  page: 'extends'
- name: 'filter'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/filter.html'
  support: 'full'
  page: 'filter'
- name: 'flush'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/flush.html'
  support: 'full'
  page: 'flush'
- name: 'for'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/for.html'
  support: 'full'
  page: 'for'
- name: 'from'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/from.html'
  support: 'full'
  page: 'from'
- name: 'if'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/if.html'
  support: 'full'
  page: 'if'
- name: 'import'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/import.html'
  support: 'full'
  page: 'import'
- name: 'include'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/include.html'
  support: 'partial'
  page: 'include'
  notes: '`only` clause and `ignore missing` clause not supported'
- name: 'macro'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/macro.html'
  support: 'full'
  page: 'macro'
- name: 'sandbox'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/sandbox.html'
  support: 'none'
- name: 'set'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/set.html'
  support: 'full'
  page: 'set'
- name: 'spaceless'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/spaceless.html'
  support: 'none'
- name: 'use'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/use.html'
  support: 'none'
- name: 'verbatim'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/verbatim.html'
  support: 'full'
  page: 'verbatim'
- name: 'with'
  twigLink: 'https://twig.symfony.com/doc/2.x/tags/with.html'
  support: 'none'



================================================
FILE: docs/src/orchid/resources/data/twig-compatibility/tests.yml
================================================
- name: 'constant'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/constant.html'
  support: 'none'
- name: 'defined'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/defined.html'
  support: 'none'
- name: 'divisible by'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/divisibleby.html'
  support: 'none'
- name: 'empty'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/empty.html'
  support: 'full'
  page: 'empty'
- name: 'even'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/even.html'
  support: 'full'
  page: 'even'
- name: 'iterable'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/iterable.html'
  support: 'full'
  page: 'iterable'
- name: 'null'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/null.html'
  support: 'full'
  page: 'null'
- name: 'odd'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/odd.html'
  support: 'full'
  page: 'odd'
- name: 'same as'
  twigLink: 'https://twig.symfony.com/doc/2.x/tests/sameas.html'
  support: 'none'

================================================
FILE: docs/src/orchid/resources/homepage.md
================================================
---
---

Pebble is a Java templating engine inspired by <a href="https://twig.symfony.com/">Twig</a> and similar to the Python [Jinja Template Engine](https://palletsprojects.com/p/jinja/) syntax. It features templates inheritance and easy-to-read syntax, ships with built-in autoescaping for security, and includes integrated support for internationalization.

## Features

* **Rich set of built-in tags and filters**
* **Template inheritance**: extract common areas of your content in a single ‘layout’ and make
your templates inherit this layout.
* **Extensible language**: new tags, filters and functions can be added to Pebble very easily.

If you already know Twig, you can compare both engines in {{ anchor('the compatibility matrix', 'Twig Compatibility') }}.

## Basic Usage
First, add the following dependency to your pom.xml:
```xml
<dependency>
	<groupId>io.pebbletemplates</groupId>
	<artifactId>pebble</artifactId>
	<version>{{ site.version }}</version>
</dependency>
```

Then create a template in your WEB-INF folder. Let's start with a base template that all
other templates will inherit from, name it "base.html":
```twig
{% verbatim %}
<html>
<head>
	<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
	<div id="content">
		{% block content %}{% endblock %}
	</div>
	<div id="footer">
		{% block footer %}
			Copyright 2018
		{% endblock %}
	</div>
</body>
</html>
{% endverbatim %}
```
Then create a template that extends base.html, call it "home.html":
```twig
{% verbatim %}
{% extends "base.html" %}

{% block title %} Home {% endblock %}

{% block content %}
	<h1> Home </h1>
	<p> Welcome to my home page. My name is {{ name }}.</p>
{% endblock %}
{% endverbatim %}
```
Now we want to compile the template, and render it:
```java
PebbleEngine engine = new PebbleEngine.Builder().build();
PebbleTemplate compiledTemplate = engine.getTemplate("home.html");

Map<String, Object> context = new HashMap<>();
context.put("name", "Mitchell");

Writer writer = new StringWriter();
compiledTemplate.evaluate(writer, context);

String output = writer.toString();
```
The output should result in the following:
```twig
<html>
<head>
	<title> Home </title>
</head>
<body>
	<div id="content">
		<h1> Home </h1>
	    <p> Welcome to my home page. My name is Mitchell.</p>
	</div>
	<div id="footer">
		Copyright 2018
	</div>
</body>
</html>
```

For more information on installation and configuration, see {{ anchor('the installation guide', 'Installation and Configuration') }}.<br/>
For more information on basic usage, see {{ anchor('the basic usage guide', 'Basic Usage') }}.<br/>
For Spring Boot integration, see {{ anchor('the Spring Boot integration guide', 'Spring Boot Integration') }}.

================================================
FILE: docs/src/orchid/resources/pages/CNAME
================================================
---
renderMode: raw
usePrettyUrl: false
---
pebbletemplates.io

================================================
FILE: docs/src/orchid/resources/pages/changelog.md
================================================
---
components:
  - type: changelog
---


================================================
FILE: docs/src/orchid/resources/pages/contributing.md
================================================
---
---

# Contributing

## Help Wanted
Contributors of all types are welcome but most importantly I am looking for help with the following:

- IDE Integration
- API Feedback
- Testing and Bug Reports
- Performance Optimizations
- Improving Thread Safety
General improvements are welcome, otherwise you can help tackle some of the [known issues](https://github.com/PebbleTemplates/pebble/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).

## Getting Started
- Fork the [repository](https://github.com/PebbleTemplates/pebble)
- Make the fix.
- Use maven to build and test:
    - `mvn clean install` from root to build Pebble
    - `mvn orchid:serve -P doc` from `docs/` to build and serve documentation on http://localhost:8080
- Submit a pull request

## Understanding the Code
There are a few major components that play a vital role in the compilation process. The main
`PebbleEngine`, the `LexerImpl`, and the `ParserImpl`.

The `PebbleEngine` is responsible for beginning the template compilation process. It begins by passing
the template source to the `Lexer`.

The `Lexer` is responsible for converting the template into a bunch of `Token` objects. A token is the smallest
distinguishable unit in a template, i.e. it can not be broken down into more specific objects. A token can
represent a delimiter (eg. `{{ '{{' }}` ), or a function name, a string, plain text, or many other things. Once the
lexer has established the entire stream of tokens which collectively make up the entire template, it returns
this `TokenStream` back to the main `PebbleEngine`.

The `PebbleEngine` now sends the `TokenStream` to the `Parser` which is responsible for turning those token objects
into `Node` objects. The nodes are built in a hierarchical fashion and together they make up the abstract
syntax tree. The parser uses the help of the main `ExpressionParser` as well as the `TokenParser` objects which
are provided by the	extensions. Each node is responsible for rendering itself during the template
evaluation phase.

The `PebbleEngine` now has a tree of node objects, beginning with the `NodeRoot`. It will then create a
`PebbleTemplateImpl` object with this root node as an argument. The last step before returning this template
to the user is to invoke both the internal and the user-provided `NodeVisitor` objects on the node tree.
Node visitors are used to process the node tree, perhaps to add extra functionality (ex. the built-in
autoescaper uses a node visitor to wrap the expressions of nodes with an escape function). Once this
processing is completed, the template is placed into the cache and finally returned to the user.

The user will then call `evaluate()` on this template which begins the evaluation process. The template
will call `render()` on it's root node which in turn will call `render()` on each of it's children nodes.
This process recurses throughout the whole node tree until all nodes have rendered themselves to the
provided `Writer` object.

## Documentation

The documentation website is generated using [Orchid](https://orchid.netlify.com/). 

The documentation files are under the `src/orchid/resources` directory.

## Contributing Code
Currently there aren't any formal guidelines. Just ensure that your changes include any
necessary unit tests and send me a pull request on [github](https://github.com/PebbleTemplates/pebble)!

## Standards and Guidelines

### Code Formatting Standards

1. Use [Google Style Guide](https://google.github.io/styleguide/javaguide.html) formatting conventions.
   1. Configuring IntelliJ to use the Google Style Guide Formatter.
      1. Clone the [Google Style Git Repo](https://github.com/google/styleguide).
      2. Open **Preferences -> Editor -> Code Style -> Java**. 
      4. Click on the gear and select **Import Scheme -> IntelliJ IDEA code style XML** and import the file **intellij-java-google-style.xml** from the [Google Style Git Repo](https://github.com/google/styleguide).
   2. Configuring Eclipse to use the Google Style Guide Formatter.
      1. Clone the [Google Style Git Repo](https://github.com/google/styleguide).
      2. Select **Preference -> Java -> Code Style -> Formatter**.
      3. Select **Import** and specify the file **eclipse-java-google-style.xml** from the [Google Style Git Repo](https://github.com/google/styleguide).

### Unit Test Guidelines

1. Use [AssertJ]() for all Unit and Integration tests. 
2. A javadoc description should be included for each test method.
3. The purpose of each test should be clear from the test method name.

## Acknowledgements
Thanks to all the following contributors who are helping to make Pebble the best template engine available for Java. 

{%- for contributor in data.contributors %}
* [{{ contributor.name }}]({{ contributor.link }})
{%- endfor %}


================================================
FILE: docs/src/orchid/resources/pages/twig-compatibility.peb
================================================
---
title: Twig Compatibility
---

While Pebble was inspired by and generally has high compatibility with Twig, it is neither a complete nor an exact Twig
implementation. There are features of Twig not supported by Pebble, there are features implemented in Pebble that are
not supported by Twig, and some features might behave differently or use a different name or syntax. This page outlines
the similarities and differences between Pebble and Twig.

{{ compat('Tags', data['twig-compatibility'].tags ) }}
{{ compat('Filters', data['twig-compatibility'].filters ) }}
{{ compat('Functions', data['twig-compatibility'].functions ) }}
{{ compat('Tests', data['twig-compatibility'].tests ) }}
{{ compat('Operators', data['twig-compatibility'].operators ) }}

{% macro compat(type, items) %}
<br>
<br>
<h2>{{ type }}</h2>
<table>
    <thead>
    <tr>
        <td>Name</td>
        <td>Pebble Support</td>
        <td>Notes</td>
    </tr>
    </thead>
    <tbody>
    {% for item in items %}
    <tr>
        <td><a href="{{ item.twigLink }}">{{ item.name }}</a></td>
        <td>
            {{ item.support }}
            {% if item.page is not empty %}
                {{ anchor('(docs)', item.page) }}
            {% endif %}
        </td>
        <td>{{ item.notes | compileAs('md') }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>
{% endmacro %}


================================================
FILE: docs/src/orchid/resources/templates/includes/sidebar.peb
================================================
<div id="sidebar">
    <div class="inner">

        <!-- Search -->
        <section id="search" class="alt">
            <form data-orchid-search="{{ (searchIndices is not empty) ? searchIndices|join(',') : '' }}">
                <input type="text" name="query" id="query" placeholder="Search"/>
            </form>
            <div class="box" id="search-results" data-orchid-search-results style="display: none;">
                <b>Search Results</b>
                <ul></ul>
            </div>
            <div class="box" id="search-progress" data-orchid-search-progress style="display: none;">
                <div class="loader">Loading...</div>
            </div>
        </section>

        <!-- Menu -->
        <nav id="siteNav" class="menu">
            <header class="major">
                <h2>{{ site.about.siteName }}</h2>
            </header>
            <ul class="top-level">
                {% for menuItem in theme.menu.getMenuItems(page) %}
                    {% include 'includes/menuItem' with {"menuItem": menuItem} %}
                {% endfor %}
            </ul>
        </nav>
        {% if not page.menu.isEmpty() %}
        <nav class="menu">
            <header class="major">
                <h2>{{ page.title }}</h2>
            </header>
            <ul class="top-level">
                {% for menuItem in page.menu.getMenuItems(page) %}
                    {% include 'includes/menuItem' with {"menuItem": menuItem} %}
                {% endfor %}
            </ul>
        </nav>
        {% endif %}

        <!-- Section -->
        <section>
            <p class="text-center">
                Currently {{ site.version }}.
            </p>
        </section>

        <!-- Footer -->
        <footer id="footer">
            <p class="copyright text-center">
                &copy; PebbleTemplates. All rights reserved.
                <br>
                Site created with <a href="https://orchid.netlify.com">Orchid </a>,
                design by <a href="https://html5up.net">HTML5 UP</a>.
            </p>
        </footer>

    </div>
</div>

================================================
FILE: docs/src/orchid/resources/templates/layouts/index.peb
================================================
<!DOCTYPE HTML>
<!--
    Editorial by HTML5 UP
    html5up.net | @ajlkn
    Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
-->
<html>
<head>
{% include '?trackingHeadStart' %}
{% head %}
<link rel="icon" type="image/png" href="favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="favicon-16x16.png" sizes="16x16" />
{% styles %}
{% include '?trackingHeadEnd' %}
</head>
<body class="is-loading">
{% include '?trackingBodyStart' %}

<!-- Wrapper -->
<div id="wrapper">

    <!-- Main -->
    <div id="main">
        <a class="github-fork-ribbon" href="https://github.com/PebbleTemplates" data-ribbon="Fork me on GitHub" title="Fork me on GitHub">Fork me on GitHub</a>
        <div class="inner">

            <!-- Header -->
            {% block innerHeader %}
                {% include 'includes/header' %}
            {% endblock %}
            {% block banner %}
            {% endblock %}
            {% block pageContent %}
                <section id="pageContent">
                    <header class="major"><h2>{{ page.title }}</h2></header>
                    <article>
                        {% page %}
                    </article>
                </section>
            {% endblock %}
        </div>
        <hr>

        <!-- Page Footer -->
        {% include 'includes/footer.peb' %}
    </div>

    <!-- Sidebar -->
    {% include 'includes/sidebar.peb' %}
</div>

{% scripts %}
<script>
(function ($) {
	$(function () {
        const href = window.location.href.replace(/\/+$/, '');

        if (!href.includes('/wiki/')) {
            return;
        }

        const a = document.querySelector('#siteNav li li a[href="' + href + '"]');
        const ul = a.closest('ul');
        const li = ul.closest('li');
        const span = li.querySelector(':scope > span');

        a.classList.add('active');
        a.style.color = '#72A6D0';
        span.style.color = '#72A6D0';

        setTimeout(function () {
            span.click();
        }, 0);
    });
}(jQuery));
</script>
{% include '?trackingBodyEnd' %}
</body>
</html>

================================================
FILE: docs/src/orchid/resources/wiki/filter/abbreviate.md
================================================
# `abbreviate`
The `abbreviate` filter will abbreviate a string using an ellipsis. It takes one argument which is the max
width of the desired output including the length of the ellipsis.
```twig
{{ "this is a long sentence." | abbreviate(7) }}
```
The above example will output the following:
```twig
this...
```

## Arguments
- length

================================================
FILE: docs/src/orchid/resources/wiki/filter/abs.md
================================================
# `abs`
The `abs` filter is used to obtain the absolute value.

```twig
{{ -7 | abs }}

{# output: 7 #}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/base64decode.md
================================================
---
---

# `base64decode`
The `base64decode` filter takes the given input, Base64-decodes it, if possible, and returns the byte array converted to UTF-8 String.
Applying the filter on an incorrect base64-encoded string will throw an exception. 

```twig
{% verbatim %}{{ "dGVzdA==" | base64decode }}{% endverbatim %}
```
The above example will output the following:
```
test
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/base64encode.md
================================================
---
---

# `base64encode`
The `base64encode` filter takes the given input, converts it to an UTF-8 String (`.toString()`) and Base64-encodes it.

```twig
{% verbatim %}{{ "test" | base64encode }}{% endverbatim %}
```
The above example will output the following:
```
dGVzdA==
```


================================================
FILE: docs/src/orchid/resources/wiki/filter/capitalize.md
================================================
---
---

# `capitalize`
The `capitalize` filter will capitalize the first letter of the string.
```twig
{% verbatim %}
{{ "article title" | capitalize }}
{% endverbatim %}
```
The above example will output the following:
```twig
Article title
```
See also: {{ anchor('title') }}

================================================
FILE: docs/src/orchid/resources/wiki/filter/date.md
================================================
# `date`
The `date` filter formats a date in a variety of formats. It can handle old-school `java.util.Date`,
Java 8 `java.time` constructs like `OffsetDateTime` and timestamps in milliseconds from the epoch.
The filter will construct a `java.text.SimpleDateFormat` or `java.time.format.DateTimeFormatter` using the provided
pattern and then use this newly created format to format the provided date object. If you don't provide a pattern,
either `DateTimeFormatter.ISO_DATE_TIME` or `yyyy-MM-dd'T'HH:mm:ssZ` will be used.

```twig
{{ user.birthday | date("yyyy-MM-dd") }}
```

An alternative way to use this filter is to use it on a string but then provide two arguments:
the first is the desired pattern for the output, and the second is the existing format used to parse the
input string into a `java.util.Date` object.
```twig
{{ "July 24, 2001" | date("yyyy-MM-dd", existingFormat="MMMM dd, yyyy") }}
```
The above example will output the following:
```twig
2001-07-24
```

## Time zones

If the provided date has time zone info (e.g. `OffsetDateTime`) then it will be used. If the provided date has no
time zone info, by default the system time zone will be used. If you need to use a specific
time zone then you can pass in a `timeZone` parameter any string that's understood by `ZoneId` / `ZoneInfo`:
```twig
{# the timeZone parameter will be ignored #}
{{ someOffsetDateTime | date("yyyy-MM-dd'T'HH:mm:ssX", timeZone="UTC") }}
{# the provided time zone will override the system default #}
{{ someInstant | date("yyyy-MM-dd'T'HH:mm:ssX", timeZone="Pacific/Funafuti") }}
```

## Arguments
- format
- existingFormat
- timeZone


================================================
FILE: docs/src/orchid/resources/wiki/filter/default.md
================================================
## `default`
The `default` filter will render a default value if and only if the object being filtered is empty.
A variable is empty if it is null, an empty string, an empty collection, or an empty map.
```twig
{{ user.phoneNumber | default("No phone number") }}
```
In the following example, if `foo`, `bar`, or `baz` are null the output will become an empty string which is a perfect use case for the default filter:
```twig
{{ foo.bar.baz | default("No baz") }}
```
Note that the default filter will suppress any `AttributeNotFoundException` exceptions that will usually be thrown when `strictVariables` is set to `true`.

## Arguments
- default


================================================
FILE: docs/src/orchid/resources/wiki/filter/escape.md
================================================
---
---

# `escape`
The `escape` filter will turn special characters into safe character references in order to avoid XSS
vulnerabilities. This filter will typically only need to be used if you've turned off autoescaping.
```twig
{% verbatim %}
{{ "<div>" | escape }}
{# output: &lt;div&gt; #}
{% endverbatim %}
```
Please read the {{ anchor('escaping guide', 'Escaping') }} for more information about escaping.

## Arguments
- strategy

================================================
FILE: docs/src/orchid/resources/wiki/filter/first.md
================================================
# `first`
The `first` filter will return the first item of a collection, or the first letter of a string.
```twig
{{ users | first }}
{# will output the first item in the collection named 'users' #}

{{ 'Mitch' | first }}
{# will output 'M' #}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/format.md
================================================
# `format`
The `format` filter formats a string by replacing placeholders with the provided arguments (placeholders follows the `String.format` notation).
```twig
{{ 'Hello %s!' | format('World') }}
{# Hello World! #}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/join.md
================================================
# `join`
The `join` filter will concatenate all items of a collection into a string. An optional argument can be given
to be used as the separator between items.
```twig
{#
    List<String> names = new ArrayList<>();
    names.add("Alex");
    names.add("Joe");
    names.add("Bob");
#}
{{ names | join(',') }}
{# will output: Alex,Joe,Bob #}
```

## Arguments
- separator

================================================
FILE: docs/src/orchid/resources/wiki/filter/last.md
================================================
# `last`
The `last` filter will return the last item of a collection, or the last letter of a string.
```twig
{{ users | last }}
{# will output the last item in the collection named 'users' #}

{{ 'Mitch' | last }}
{# will output 'h' #}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/length.md
================================================
# `length`
The `length` filter returns the number of items of collection, map or the length of a string:

```twig
{% if users|length > 10 %}
    ...
{% endif %}
```


================================================
FILE: docs/src/orchid/resources/wiki/filter/lower.md
================================================
# `lower`
The `lower` filter makes an entire string lower case.
```twig
{{ "THIS IS A LOUD SENTENCE" | lower }}
```
The above example will output the following:
```twig
this is a loud sentence
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/nl2br.md
================================================
# `nl2br`

The `nl2br` filter converts newline characters (`\r`, `\n`, `\r\n`) in a string to HTML line break tags (`<br />`). This
is useful when you want to preserve line breaks in text when displaying it in a web page.

```pebble
{{ "I like Pebble.\nYou will like it too."|nl2br }}
{# outputs
    I like Pebble.<br />You will like it too.
#}
```


================================================
FILE: docs/src/orchid/resources/wiki/filter/numberformat.md
================================================
# `numberformat`
The `numberformat` filter is used to format a decimal number. Behind the scenes it uses `java.text.DecimalFormat`.
```twig
{{ 3.141592653 | numberformat("#.##") }}
```
The above example will output the following:
```twig
3.14
```

## Arguments
- format

================================================
FILE: docs/src/orchid/resources/wiki/filter/raw.md
================================================
---
---

# `raw`
The `raw` filter prevents the output of an expression from being escaped by the autoescaper.
The `raw` filter must be the very last operation performed within the expression otherwise the
autoescaper will deem the expression as potentially unsafe and escape it regardless.

```twig
{% verbatim %}
{% set danger = "<div>" %}
{{ danger | upper | raw }}
{# ouptut: <DIV> #}
{% endverbatim %}
```

If the `raw` filter is not the last operation performed then the expression will be escaped:
```twig
{% verbatim %}
{% set danger = "<div>" %}
{{ danger | raw | upper }}
{# output: &lt;DIV&gt; #}
{% endverbatim %}
```
Please read the {{ anchor('escaping guide', 'Escaping') }} for more information about escaping.

================================================
FILE: docs/src/orchid/resources/wiki/filter/replace.md
================================================
# `replace`
The 'replace' filter formats a given string by replacing the placeholders (placeholders are free-form):
```twig
{{ "I like %this% and %that%." | replace({'%this%': foo, '%that%': "bar"}) }}
```

## Arguments
- placeholders to replace

================================================
FILE: docs/src/orchid/resources/wiki/filter/reverse.md
================================================
# `reverse`
The 'reverse' filter reverses a List:
```twig
{% for user in users | reverse %} {{ user }} {% endfor %}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/rsort.md
================================================
# `rsort`
The `rsort` filter will sort a list in reversed order. The items of the list must implement `Comparable`.
```twig
{% for user in users | rsort %}
	{{ user.name }}
{% endfor %}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/sha256.md
================================================
---
---

# `sha256`
The `sha256` filter returns the SHA-256 hash of the given UTF-8 String.

```twig
{% verbatim %}{{ "test" | sha256 }}{% endverbatim %}
```
The above example will output the following:
```
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/slice.md
================================================
# `slice`
The `slice` filter returns a portion of a list, array, or string.
```twig
{{ ['apple', 'peach', 'pear', 'banana'] | slice(1,3) }}
{# results in: [peach, pear] #}


{{ 'Mitchell' | slice(1,3) }}
{# results in: 'it' #}
```

## Arguments
- `fromIndex`: 0-based and inclusive
- `toIndex`: 0-based and exclusive


================================================
FILE: docs/src/orchid/resources/wiki/filter/sort.md
================================================
# `sort`
The `sort` filter will sort a list. The items of the list must implement `Comparable`.
```twig
{% for user in users | sort %}
	{{ user.name }}
{% endfor %}
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/split.md
================================================
# `split`
The `split` filter splits a string by the given delimiter and returns a list of strings.
```twig
{% set foo = "one,two,three" | split(',') %}
{# foo contains ['one', 'two', 'three'] #}
```

You can also pass a limit argument:
- If `limit` is positive, then the pattern will be applied at most n - 1 times, the array's length will be no greater than n, and the array's last entry will contain all input beyond the last matched delimiter;
- If `limit` is negative, then the pattern will be applied as many times as possible and the array can have any length;
- If `limit` is zero, then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded;

```twig
{% set foo = "one,two,three,four,five" | split(',', 3) %}
{# foo contains ['one', 'two', 'three,four,five'] #}
```

## Arguments
- delimiter: The delimiter
- limit: The limit argument

================================================
FILE: docs/src/orchid/resources/wiki/filter/title.md
================================================
---
---

# `title`
The `title` filter will capitalize the first letter of each word.
```twig
{% verbatim %}
{{ "article title" | title }}
{% endverbatim %}
```
The above example will output the following:
```twig
Article Title
```

See also: {{ anchor('capitalize') }}


================================================
FILE: docs/src/orchid/resources/wiki/filter/trim.md
================================================
# `trim`
The `trim` filter is used to trim whitespace off the beginning and end of a string.
```twig
{{ "    This text has too much whitespace.    " | trim }}
```
The above example will output the following:
```twig
This text has too much whitespace.
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/upper.md
================================================
# `upper`
The `upper` filter makes an entire string upper case.

```twig
{{ "this is a quiet sentence." | upper }}
```
The above example will output the following:
```twig
THIS IS A QUIET SENTENCE.
```

================================================
FILE: docs/src/orchid/resources/wiki/filter/urlencode.md
================================================
# `urlencode`

The `urlencod` translates a string into `application/x-www-form-urlencoded` format using the "UTF-8" encoding scheme.

```twig
{{ "The string ü@foo-bar" | urlencode }}
```

The above example will output the following:
```twig
The+string+%C3%BC%40foo-bar
```

================================================
FILE: docs/src/orchid/resources/wiki/function/blockFunction.md
================================================
---
---

# `block`
The `block` function is used to render the contents of a block more than once. It is not to be confused
with the block *tag* which is used to declare blocks.

The following example will render the contents of the "post" block twice; once where it was declared
and again using the `block` function:
```twig
{% verbatim %}
{% block "post" %} content {% endblock %}

{{ block("post") }}
{% endverbatim %}
```
The above example will output the following:
```twig
content

content
```

## Performance Warning
The `block` function will impair the use of the {{ anchor('flush') }} tag used within the block being rendered.
It is typically okay for a block to use the `flush` tag which will flush the already-rendered
content to the user-provided `Writer` but the block function will internally use it's own `StringWriter` and
therefore flushing inside the block will no longer do any good (nor will it do harm).

================================================
FILE: docs/src/orchid/resources/wiki/function/i18n.md
================================================
# `i18n`
The `i18n` function is used to retrieve messages from a locale-specific `ResourceBundle`.
Every `PebbleTemplate` is assigned a default locale from the `PebbleEngine`. At the point of evaluation, this
locale can be changed with an argument to the `evaluate(...)` method of the individual template.

The `i18n` function wraps around `ResourceBundle.getBundle(name, locale).getObject(key)`.
The first argument to the `i18n` function is the name of the bundle and the second argument is the key
within the bundle.

```twig
{{ i18n("messages","greeting") }}
```

The above example assumes you have `messages.properties` on your classpath and that that file contains
a key by the name of `greeting`. If the locale of that template was `es_US` for example, it would look for a
`message_es_US.properties` file instead.

Going a little further, you can use variables within your message and pass a list of params to this
function which will replace your variables using `MessageFormat`:
```twig
{# greeting.someone=Hello, {0} #}
{{ i18n("messages","greeting", "Jacob") }}

{# output: Hello, Jacob #}
```

## Arguments
- bundle
- key
- params

================================================
FILE: docs/src/orchid/resources/wiki/function/max.md
================================================
# `max`
The `max` function will return the largest of it's numerical arguments.
```twig
{{ max(user.age, 80) }}
```

================================================
FILE: docs/src/orchid/resources/wiki/function/min.md
================================================
# `min`
The `min` function will return the smallest of it's numerical arguments.
```twig
{{ min(user.age, 80) }}
```

================================================
FILE: docs/src/orchid/resources/wiki/function/parent.md
================================================
# `parent`

The `parent` function is used inside of a block to render the content that the parent template would
have rendered inside of the block had the current template not overriden it. It is similar to Java's `super` keyword.

Let's assume you have a template, "parent.peb" that looks something like this:
```twig
{% block "content" %}
	parent contents
{% endblock %}
```
And then you have another template, "child.peb" that extends "parent.peb":
```twig
{% extends "parent.peb" %}

{% block "content" %}
	child contents
	{{ parent() }}
{% endblock %}
```
The output will look something like the following:
```twig
parent contents
child contents
```

================================================
FILE: docs/src/orchid/resources/wiki/function/range.md
================================================
# `range`
The `range` function will return a list containing an arithmetic progression of numbers:
```twig
{% 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):
```twig
{% for i in range(0, 6, 2) %}
    {{ i }},
{% endfor %}

{# outputs 0, 2, 4, 6, #}
```

Pebble built-in .. operator is just a shortcut for the range function with a step of 1+
```twig
{% for i in 0..3 %}
    {{ i }},
{% endfor %}

{# outputs 0, 1, 2, 3, #}
```


================================================
FILE: docs/src/orchid/resources/wiki/guide/basic-usage.md
================================================
---
---

# Basic Usage

## Introduction
Pebble templates can be used to generate any sort of textual output. It is typically used to generate HTML but it can
also be used to create CSS, XML, JS, etc. A template itself will contain whatever language you are attempting to output
alongside Pebble-specific features and syntax. Here is a simple example that will generate a trivial HTML page:

```twig
{% verbatim %}
<html>
	<head>
		<title>{{ websiteTitle }}</title>
	</head>
	<body>
		{{ content }}
	</body>
</html>
{%- endverbatim %}
```
When you evaluate the template you will provide it with a "context" which is just a map of variables.
This context should include the two variables above, `websiteTitle` and `content`.

## Set Up
You will want to begin by creating a PebbleEngine object which is responsible for compiling your templates:
```java
PebbleEngine engine = new PebbleEngine.Builder().build();
```
And now, with your new PebbleEngine instance you can start compiling templates:
```java
PebbleTemplate compiledTemplate = engine.getTemplate("templates/home.html");
```
Finally, simply provide your compiled template with a java.io.Writer object and a Map of variables (the context)
to get your output!
```java
Writer writer = new StringWriter();

Map<String, Object> context = new HashMap<>();
context.put("websiteTitle", "My First Website");
context.put("content", "My Interesting Content");

compiledTemplate.evaluate(writer, context);

String output = writer.toString();
```

## Syntax Reference
There are two primary delimiters used within a Pebble template: `{% verbatim %}{{ ... }}{% endverbatim %}` and `{% verbatim %}{% ... %}{% endverbatim %}`. The first set of delimiters
will output the result of an expression. Expressions can be very simple (ex. a variable name) or much more complex.
The second set of delimiters is used to change the control flow of the template; it can contain an if-statement,
define a parent template, define a new block, etc.

## Variables
You can print variables directly to the output; for example, if the context contains a variable called `foo` which is a
String with the value "bar" you can do the following which will output "bar".
```twig
{% verbatim %}{{ foo }}{% endverbatim %}
```
You can use the dot (.) notation to access attributes of variables. If the attribute contains any atypical
characters, you can use the subscript notation ([]) instead.
```twig
{% verbatim %}
{{ foo.bar }}
{{ foo["bar"] }}
{%- endverbatim %}
```
Behind the scenes `foo.bar` will attempt the following techniques to to access the `bar` attribute of the `foo`
variable:
- If `foo` is a Map, `foo.get("bar")`
- `foo.getBar()`
- `foo.isBar()`
- `foo.hasBar()`
- `foo.bar()`
- `foo.bar`

Additionally, if `foo` is a List, then `foo[0]` can be used instead of `foo.get(0)`.

If the value of variable (or attribute) is null it will output an empty string.

## Type Safety
Pebble templates are dynamically typed and any possible type safety issues won't occur until the actual runtime
evaluation of your templates. Pebble does however allow you to choose how to handle type safety issues with the use
of it's `strictVariables` setting. By default, `strictVariables` is set to `false` which means that the following:
```twig
{% verbatim %}{{ foo.bar }}{% endverbatim %}
```
will print an empty string even if the object `foo` does not actually have an attribute called `bar`.
If `strictVariables` is set to true, the above expression would throw an exception.

When `strictVariables` is set to false your expressions are also null safe. The following expression will print an
empty string even if foo and/or bar are null:
```twig
{% verbatim %}{{ foo.bar.baz }}{% endverbatim %}
```
The {{ anchor('default') }} filter might come in handy for the above situations.

## Filters

Output can be further modified with the use of filters. Filters are separated from the variable using a
pipe symbol (`|`) and may have optional arguments in parentheses. Multiple filters can be chained and the output
of one filter is applied to the next.
```twig
{% verbatim %}{{ "If life gives you lemons, eat lemons." | upper | abbreviate(13) }}{% endverbatim %}
```
The above example will output the following:
```twig
IF LIFE GI...
```

## Functions
Whereas filters are intended to modify existing content/variables, functions are intended to generate new content.
Similar to other programming languages, functions are invoked via their name followed by parentheses (`()`).
```twig
{% verbatim %}{{ max(user.score, highscore) }}{% endverbatim %}
```

## Control Structure
Pebble provides several tags to control the flow of your template, two of the main ones being the {{ anchor('for') }} loop,
and {{ anchor('if') }} statements.
```twig
{% verbatim %}
{% for article in articles %}
    <h3>{{ article.title }}</h3>
    <p>{{ article.content }}</p>
{% else %}
    <p> There are no articles. </p>
{% endfor %}
{%- endverbatim %}
```
```twig
{% verbatim %}
{% if category == "news" %}
    {{ news }}
{% elseif category == "sports" %}
    {{ sports }}
{% else %}
    <p>Please select a category</p>
{% endif %}
{%- endverbatim %}
```

## Including other Templates
The {{ anchor('include') }} tag is used to include the rendered output of one template into another.
```twig
{% verbatim %}
<div class="sidebar">
	{% include "advertisement.html" %}
</div>
{%- endverbatim %}
```

## Template Inheritance
Template inheritance is the most powerful feature of Pebble. It allows templates to override sections of their parent
template. In your parent template you define "blocks" which are the sections that are allowed to be overriden.

First let us look at an example of a parent template:
```twig
{% verbatim %}
<html>
<head>
	<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
	<div id="content">
		{% block content %}{% endblock %}
	</div>
	<div id="footer">
		{% block footer %}
			Copyright 2013
		{% endblock %}
	</div>
</body>
</html>
{% endverbatim %}
```
In the above example, we have used the {{ anchor('block') }} tag to define several sections that child templates are
allowed to override.

A child template might look like this:

```twig
{% verbatim %}
{% extends "parent.html" %}

{% block title %} Home {% endblock %}

{% block content %}
	<h1> Home </h1>
	<p> Welcome to my home page.</p>
{% endblock %}
{%- endverbatim %}
```

The first line uses the {{ anchor('extends') }} tag to declare the parent template. The extends tag should be the
first tag in the template and there can only be one.

Evaluating the child template will produce the following output:

```twig
<html>
<head>
	<title>Home</title>
</head>
<body>
	<div id="content">
		<h1> Home </h1>
		<p> Welcome to my home page.</p>
	</div>
	<div id="footer">
		Copyright 2013
	</div>
</body>
</html>
```

You may have noticed that in the above example, because the child template doesn't override the `footer` block,
the value from the parent is used instead.

Dynamic inheritance is possible by using an expression with the `extends` tag:
```twig
{% verbatim %}{% extends ajax ? 'ajax.html' : 'base.html' %}{% endverbatim %}
```

## Macros
Macros are lightweight and reusable template fragments. A macro is defined via the {{ anchor('macro') }} tag:
```twig
{% verbatim %}
{% macro input(type, name) %}
	<input type="{{ type }}" name="{{ name }}" />
{% endmacro %}
{% endverbatim %}
```
And the macro will be invoked just like a function:
```twig
{% verbatim %}{{ input("text", "name", "Mitchell") }}{% endverbatim %}
```
Child templates will have access to macros defined in a parent template. To use macros located in a completely
different template, you can use the {{ anchor('import') }}) tag. A macro does not have access to the main context; the
only variables it can access are it's local arguments.

## Named Arguments
Using named arguments allows you to be more explicit with the values you are passing to a filter, function, test or
macro. They also allow you to avoid specifying arguments for which you don't want to change the default value.
```twig
{% verbatim %}{{ stringDate | date(existingFormat="yyyy-MMMM-d", format="yyyy/MMMM/d") }}{% endverbatim %}
```

Positional arguments can be used in conjunction with named arguments but all positional arguments must come before
any named arguments:
```twig
{% verbatim %}{{ stringDate | date("yyyy/MMMM/d", existingFormat="yyyy-MMMM-d") }}{% endverbatim %}
```
Macros are a great use case for named arguments because they also allow you to define default values for
unused arguments:
```twig
{% verbatim %}
{% macro input(type="text", name, value) %}
	<input type="{{ type }}" name="{{ name }}" value="{{ value }}" />
{% endmacro %}

{{ input(name="country") }}

{# will output: <input type="text" name="country" value="" /> #}
{%- endverbatim %}
```

## Escaping
[XSS vulnerabilites](https://en.wikipedia.org/wiki/Cross-site_scripting) are the most common types of security
vulnerabilities in web applications and in order to avoid them you must escape potentially unsafe data before
presenting it to the end user. Pebble provides autoescaping of all such data which is enabled by default.
Autoescaping can be turned off, in which case Pebble provides an escape filter for more fine-grained manual escaping.

The following is an example of how autoescaping will escape your context variables:
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger }}

{# will output: &lt;br&gt; #}
{%- endverbatim %}
```
If autoescaping is disabled you can still use the {{ anchor('escape') }} filter to aid with manual escaping:
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger | escape }}

{# will output: &lt;br&gt; #}
{%- endverbatim %}
```
By default, the autoescaping mechanism and the escape filter assume that it is escaping within an HTML context.
You may want to use an alternate escaping strategy depending on the context:
```twig
{% verbatim %}
{% set danger = "alert(...)" %}
<script>var username="{{ danger | escape(strategy="js") }}"</script>
{%- endverbatim %}
```
See the {{ anchor('escaping guide', 'Escaping') }} for more information on how autoescaping works, how to disable it, and the various
escaping strategies that are available.

## Whitespace
The first newline after a pebble tag is automatically ignored; all other whitespace is ignored by Pebble and will be
included in the rendered output.

Pebble provides a whitespace control modifier to trim leading or trailing whitespace adjacent to any pebble tag.
```twig
{% verbatim %}
<p> 		{{- "no whitespace" -}}		</p>
{# output: "<p>no whitespace</p>" #}
{%- endverbatim %}
```
It is also possible to only use the modifier on one side of the tag:
```twig
{% verbatim %}
<p> 		{{- "no leading whitespace" }}		</p>
{# output: "<p>no whitespace		</p>" #}
{%- endverbatim %}
```

## Comments
You can comment out any part of the template using the `{# ... #}` delimiters. These comments will not appear in
the rendered output.
```twig
{% verbatim %}
{# THIS IS A COMMENT #}
{% for article in articles %}
	<h3>{{ article.title }}</h3>
	<p>{{ article.content }}</p>
{% endfor %}
{%- endverbatim %}
```

## Expressions
Expressions in a Pebble template are very similar to expressions found in Java.

### Literals
The simplest form of expressions are literals. Literals are representations for Java types such as strings and numbers.
- `"Hello World"`: Everything between two double or single quotes is a string. You can use a backslash to escape
quotation marks within the string.
- `"Hello #{who}"`: String interpolation is also possible using `#{}` inside quotes. In this example,
if the value of the variable `who` is `"world"`, then the expression will be evaluated to `"Hello world"`.
- `100 + 10l * 2.5`: Integers, longs and floating point numbers are similar to their Java counterparts.
- `true` / `false`: Boolean values equivalent to their Java counterparts.
- `null`: Represents no specific value, similar to it's Java counterpart. `none` is an alias for null.

### Collections
Both lists and maps can be created directly within the template.
- `["apple", "banana", "pear"]`: A list of strings
- `{"apple":"red", "banana":"yellow", "pear":"green"}`: A map of strings

The collections can contain expressions.

### Math
Pebble allows you to calculate values using some basic mathematical operators. The following operators are supported:
- `+`: Addition
- `-`: Subtraction
- `/`: Division
- `%`: Modulus
- `*`: Multiplication

### Logic
You can combine multiple expressions with the following operators:
- `and`: Returns true if both operands are true
- `or`: Returns true if either operand is true
- `not`: Negates an expression
- `(...)`: Groups expressions together

### Comparisons
The following comparison operators are supported in any expression: `==`, `!=`, `<`, `>`, `>=`, and `<=`.
```twig
{% verbatim %}
{% if user.age >= 18 %}
	...
{% endif %}
{%- endverbatim %}
```

### Tests
The `is` operator performs tests. Tests can be used to test an expression for certain qualities.
The right operand is the name of the test:
```twig
{% verbatim %}
{% if 3 is odd %}
	...
{% endif %}
{%- endverbatim %}
```
Tests can be negated by using the is not operator:
```twig
{% verbatim %}
{% if name is not null %}
	...
{% endif %}
{%- endverbatim %}
```

### Conditional (Ternary) Operator
The conditional operator is similar to its Java counterpart:
```twig
{% verbatim %}{{ foo ? "yes" : "no" }}{% endverbatim %}
```

### Operator Precedence
In order from highest to lowest precedence:
- `.`
- `|`
- `%`, `/`, `*`
- `-`, `+`
- `==`, `!=`, `>`, `<`, `>=`, `<=`
- `is`, `is not`
- `and`
- `or`

### Limiting the size of the rendered output

In case you’re running Pebble with templates provided by someone else, there’s an attack similar to
[zip bombs](https://en.wikipedia.org/wiki/Zip_bomb) or [XML bombs](https://en.wikipedia.org/wiki/Billion_laughs_attack)
that might cause your process to run out of memory. To protect against it, you can limit the size of the output when
evaluating a template:
```java
PebbleEngine pebble = new PebbleEngine.Builder()
                // Output should not exceed 10 MB.
                .maxRenderedSize(10 * 1024 * 1024)
                .build();
```

This will throw a `PebbleException` when a template evaluation tries to write more characters than the limit you set.

### IDE's plugin
If you want to add IDE's syntax highlighting, you can install this [plugin](https://plugins.jetbrains.com/idea/plugin/9407-pebble) for IntelliJ. Thank you to Bastien Jansen for his contribution.


================================================
FILE: docs/src/orchid/resources/wiki/guide/customize-defaults.md
================================================
---
---

Pebble comes with a rich set of built-in tags and filters that will help you render your templates into  websites and other documents with ease. However, imagine a more specific use-case where the templates are not entirely under your control.

In these cases it might be advised to consider stripping-down Pebbles' built-in functionality that may otherwise introduce security-concers regarding the integrity and stability of your application.

### Opt-Out using ExtensionCustomizer

The `ExtensionCustomizer` base class can be used to gain access to the default functionality before it is loaded into Pebbles template engine. Overwrite methods to get hold on provided default-functionality and modify whatever should be available for the template engine.

The following example removes the `ForTokenParser`, i.e. the ability to parse `{% for %}{{ ... }}{% endfor %}` constructs:

```java
class ExampleOptOuts extends ExtensionCustomizer {

  public ExampleOptOuts(Extension ext) {
    super(ext);
  }

  @Override
  public List<TokenParser> getTokenParsers() {
    List<TokenParser> tokenParsers = Optional.ofNullable(super.getTokenParsers())
                                        .map(ArrayList::new).orElseGet(ArrayList::new);
      
    tokenParsers.removeIf(x -> x instanceof ForTokenParser);
    return tokenParsers;
  }

}
```

The `ExtensionCustomizer` will be used to wrap any Pebble-extension which is provided by default. It can be registered in your setup code to create `PebbleEngine`:

```java
PebbleEngine engine = new PebbleEngine.Builder().registerExtensionCustomizer(ExampleOptOuts::new).build();
```

### Default implementation of ExtensionCustomizer

The `DisallowExtensionCustomizerBuilder` class can be used to disallow some default functionality, make pebble more controllable.

For example of use, see below:

```java
PebbleEngine engine = new PebbleEngine.Builder()
        .registerExtensionCustomizer(new DisallowExtensionCustomizerBuilder()
                .disallowedTokenParserTags(singletonList("flush"))
                .disallowedFunctionKeys(singletonList("max"))
                .disallowedFilterKeys(singletonList("upper"))
                .disallowedTestKeys(singletonList("null"))
                .disallowedBinaryOperatorSymbols(singletonList(">"))
                .disallowedUnaryOperatorSymbols(singletonList("-"))
                .build())
        .build();
```

================================================
FILE: docs/src/orchid/resources/wiki/guide/escaping.md
================================================
---
---

# Escaping

## Overview
[XSS vulnerabilites](https://en.wikipedia.org/wiki/Cross-site_scripting) are the most common types of security
vulnerabilities in web applications and in order to avoid them you must escape potentially unsafe data before
presenting it to the end user. Pebble provides autoescaping of all such data which is enabled by default.
Autoescaping can be turned off, in which case Pebble provides an {{ anchor('escape') }} filter for more
fine-grained manual escaping.

## Autoescaping
Autoescaping, which is enabled by default, will automatically escape the outcome of expressions
contained within print delimiters, i.e. {% verbatim %}`{{` and `}}`{% endverbatim %}:
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger }}

{# will output: &lt;br&gt; #}
{%- endverbatim %}
```
The {{ anchor('raw') }} filter can be used to prevent the autoescaper from escaping a particular expression. It is
important that the raw filter is the last operation performed in the expression.
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger | raw }}

{# will output: <br> #}
{%- endverbatim %}
```
If the raw filter is not the last operation performed within the expression, the expression will be deemed
as possibly unsafe by the autoescaper and will be escaped. For example:
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger | raw | uppercase }}

{# will output: &lt;BR&gt; #}
{%- endverbatim %}
```

### Exceptions
There are a few exceptions where expressions are **not** automatically escaped:
- If the expression only contains a string literal, it is assumed to be safe. For example:
```twig
{% verbatim %}
{{ '<br>' }}

{# will output: <br> #}
{%- endverbatim %}
```
- The last operation contained within that expression is a filter or function that explicitly returns safe output. Such a filter or function would return an instance of `SafeString` instead of a regular String. The built-in filters that return safe markup include: `date`, `escape`, and `raw`. These filters must be the last operation performed within the expression in order for their output to be ignored by the autoescaper. For example:
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger | uppercase | raw }}

{# will output: <br> #}
{%- endverbatim %}
```

### Autoescape Tag
The {{ anchor('autoescape') }} tag can be used to temporarily disable/re-enable the autoescaper as well as
change the escaping strategy for a portion of the template.
```twig
{% verbatim %}
{{ danger }} {# will be escaped by default #}
{% autoescape false %}
	{{ danger }} {# will not be escaped #}
{% endautoescape %}
{%- endverbatim %}
```
```twig
{% verbatim %}
{{ danger }} {# will use the "html" escaping strategy #}
{% autoescape "js" %}
	{{ danger }} {# will use the "js" escaping strategy #}
{% endautoescape %}
{%- endverbatim %}
```

### Disabling Autoescaper
```java
PebbleEngine engine = new PebbleEngine.Builder().autoEscaping(false).build();
```

## Manual Escaping
If autoescaping is disabled you can still use the {{ anchor('escape') }} filter to aid with manual escaping:
```twig
{% verbatim %}
{% set danger = "<br>" %}
{{ danger | escape }}

{# will output: &lt;br&gt; #}
{%- endverbatim %}
```

## Strategies
When escaping data it is crucial that you utilize the correct escaping strategy depending on the context of the data.
By default, the autoescaper and the `escape` filter assume that you are escaping HTML data.
I highly recommend reading the [OWASP Cheat Sheet](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet)
to understand the significance of escaping context.

Pebble provides the following escaping strategies:

- html
- js
- css
- url_param

You can use the {{ anchor('autoescape') }} tag to temporarily change the strategy used by the autoescaper otherwise you can
change the globally used default strategy:
```java
PebbleEngine engine = new PebbleEngine.Builder().defaultEscapingStrategy("js").build();
```
The escape filter will also accept a strategy as an argument:
```js
{% verbatim %}
var username ="{{ user.name | escape(strategy="js") }}";
{%- endverbatim %}
```

### Custom Strategy
You can add a custom escaping strategy by implementing `EscapingStrategy` and adding it to the `EscaperExtension`:
```java
PebbleEngine engine = new PebbleEngine.Builder().addEscapingStrategy("custom", new CustomEscapingStrategy()).build();
```

================================================
FILE: docs/src/orchid/resources/wiki/guide/extending-pebble.md
================================================
---
---

# Extending Pebble

## Overview
Pebble was designed to be flexible and accomodate the requirements of any project. You can add your own tags,
functions, operators, filters, tests, and global variables. The majority of these are quite trivial to implement.

Begin by creating a class that implements `Extension`. For your own convenience, I recommend extending
`AbstractExtension` if you can. After implementing the required methods, register your extension with the `PebbleEngine`
before compiling any templates:
```java
PebbleEngine engine = new PebbleEngine.Builder().extension(new CustomExtension()).build();
```

## Filters
To create custom filters, implement the `getFilters()` method of your extension which will return a map of filter
names and their corresponding implementations. A filter implementation must implement the `Filter` interface.
The	`Filter` interface requires two methods to be implemented, `getArgumentNames()` and `apply()`. The
`getArgumentNames()` method returns a list of Strings that define both the order and names of expected arguments. If 
this method returns null or an empty list, the filter supports dynamic arguments. This means the user can pass any 
number of arguments—either named (e.g., myFilter(param="value")) or positional (e.g., myFilter("value"))—and they will be available in the arguments map.

The `apply` method is the actual filter implementation. Here's the parameters definition.

| Parameter name | Description |
| --- | --- |
| input | the data to be filtered |
| args | the map of arguments the user may have provided |
| self | An instance of `PebbleTemplate` which can be used to retrieve the template name for example |
| context | An instance of `EvaluationContext` which can be used to retrieve the locale for example| 
| lineNumber | Useful when throwing exception to provide line number | 
 
Because Pebble is dynamically typed, you will have to downcast the arguments to the expected type.
Here is an example of how the {{ anchor('upper') }} filter might be implemented:
```java
public class UpperFilter implements Filter {

	@Override
	public List<String> getArgumentNames() {
		return null;
	}

	@Override
	public Object apply(Object input, Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber){
		if(input == null){
			return null;
		}
		if (input instanceof String) {
			return ((String) input).toUpperCase(context.getLocale());
		} else {
			return input.toString().toUpperCase(context.getLocale());
		}
	}

}
```

## Tests
Adding custom tests is very similar to custom filters. Implement the `getTests()` method within your
extension which will return a map of test names and their corresponding implementations. A test
implementation will implement the `Test` interface. The `Test` interface is exactly like the `Filter`
interface except the apply method returns a boolean instead of an arbitrary object of any type.

Here is an example of how the {{ anchor('even') }} test might be implemented:
```java
public class EvenTest implements Test {

	@Override
	public List<String> getArgumentNames() {
		return null;
	}

	@Override
	public boolean apply(Object input, Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber){
		if (input == null) {
			throw new PebbleException(null, "Can not pass null value to \"even\" test.", lineNumber, self.getName());
		}
    
		if (input instanceof Integer) {
			return ((Integer) input) % 2 == 0;
		} else {
			return ((Long) input) % 2 == 0;
		}
	}

}
```

## Functions
Adding functions is also very similar to custom filters. First and foremost, it's important to
understand the different intentions behind a function and a filter because it can often be ambiguous
which one should be implemented. A filter is intended to modify existing content where a function is
moreso intended to produce new content.

To add functions, implement the `getFunctions()` method within your extension which will return a map of function
names and their corresponding implementations. A function implementation will implement the `Function` interface.
The	`Function` interface is very similar to the `Filter` and `Test` interfaces.

Here is an example of how a fictional `fibonacciString` function might be implemented:
```java
public class FibonnaciStringFunction implements Function {

	@Override
	public List<String> getArgumentNames() {
		List<String> names = new ArrayList<>();
		names.add("length");
		return names;
	}

	@Override
	public Object execute(Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber) {
		Integer length = (Integer)args.get("length");
		Integer prev1 = 0;
		Integer prev2 = 1;

		StringBuilder result = new StringBuilder();

		result.append("01");

		for(int i = 2; i < length; i++){
			Integer next = prev1 + prev2;
			result.append(next);
			prev1 = prev2;
			prev2 = next;
		}
		return result.toString();

	}
}
```

## Positional and Named Arguments
For filters, tests, and functions it is required that you implement the `getArgumentNames` method even if it
returns null. Returning a list of strings will allow the end user to call your filter/test/function using
named arguments. If this method returns null or an empty list, the function supports dynamic arguments. This means 
the user can pass any number of arguments—either named (e.g., myFunction(param="value")) or positional 
(e.g., myFunction("value"))—and they will be available in the arguments map.

Using the above fictional fibonacci function as an example, a user can invoke it in two different ways:
```twig
{% verbatim %}
{{ fibonacci(10) }}
{{ fibonacci(length=10) }}
{%- endverbatim %}
```
If the end user excludes the names and only uses positional arguments, the argument values will still end up
be mapped to the proper names when it's time to invoke the function's execute method. Your function implementation
doesn't have to worry whether the user used positional or named arguments. It is important though that if the
filter/function/test expects more than one argument, then the developer must communicate to the user the expected
order of arguments in the chance that the user wants to invoke it without using names.

Some functions such as the built in `min` and `max` functions accept an unlimited amount of arguments.
For this to happen, your function must not accept any named arguments (i.e. your `getArgumentNames` method
will return null or empty) and your `execute`` method will simply iterate over the values of the user provided
argument map while ignoring the keys of that map (Pebble will use arbitrary keys if there are no names to map to).

## Global Variables
Adding global variables, which are variables that are accessbile to all templates, is very trivial.
In your custom extension, implement the `getGlobalVariables()` method which returns a `Map<String,Object>`.
The contents of this map will be merged into the context you provide to each template at the time of rendering.

## Operators
Operators are more complex to implement than filters or tests. To add custom operators, implement the
`getBinaryOperators()` or the `getUnaryOperators()` method in your extension, or both. These methods return a
list of `BinaryOperator` or `UnaryOperator` objects, respectively.

Binary operators require the following information:
- Precedence: an integer relative to other operators which defines the order of operations.
- Symbol: a String representing the actual operator. This is typically a single character but doesn't have to be.
- Expression Class: A class that extends `BinaryExpression`. This class will perform the actual operator implementation.
- Associativity: Either left or right depending on how the operator is used.

A unary operator is much the same except it's expression class must extend `UnaryExpression` and there is no associativity.

The precedence values for existing core operators are as followed:
- `or`: 10
- `and`: 15
- `is`: 20
- `is not`: 20
- `==`: 30
- `!=`: 30
- `>`: 30
- `<`: 30
- `>=`: 30
- `<=`: 30
- `+`: 40
- `-`: 40
- `not`: 50 (Unary)
- `*`: 60
- `/`: 60
- `%`: 60
- `|`: 100
- `+`: 500 (Unary)
- `-`: 500 (Unary)

The following is an	example of how the addition operator (`+`) might have been implemented:
```java
public class AdditionOperator implements BinaryOperator {

	public int getPrecedence(){
		return 30;
	}

	public String getSymbol(){
		return "+";
	}

    public BinaryExpression<?> createInstance() {
        return new AddExpression();
    }

    public BinaryOperatorType getType() {
        return BinaryOperatorType.NORMAL;
    }

	public Associativity getAssociativity(){
		return Associativity.LEFT;
	}

}
```
Alongside each operator class you will also need to implement a corresponding `BinaryExpression` class
which actually implements the operator. The above example references a fictional `AdditionExpression` class
which might look like the following:
```java
public class AdditionExpression extends BinaryExpression<Object> {

	@Override
	public Object evaluate(PebbleTemplateImpl self, EvaluationContext context){
		Integer left = (Integer)getLeftExpression().evaluate(self, context);
		Integer right = (Integer)getRightExpression().evaluate(self, context);

		return left + right;
	}

}
```
In the above example you will notice that children of BinaryExpression have access to two other
expressions, `leftExpression`, and `rightExpression`; these are the operands of your operator.
Please note that in the above example both operands are casted to Integers but in reality you can't
always make that assumption; the true addition expression is much more complex to handle different
types of operands (Integers, Longs, Doubles, etc).

## Tags
Creating new tags is one of the most powerful abilities of Pebble. Your extension should start by
implementing the `getTokenParsers()` method. A `TokenParser` is responsible for converting all
necessary tokens to appropriate `RenderableNodes`. A token is a significant and irreducible
group of characters found in a template (such as an operator, whitespace, variable name, delimiter, etc)
and a `RenderableNode` is a Pebble class that is responsible for generating output.

Let us look at an example of a `TokenParser`:
```java
public class SetTokenParser implements TokenParser {

	public String getTag(){
		return "set";
	}

	@Override
	public RenderableNode parse(Token token, Parser parser) {
		TokenStream stream = parser.getStream();
		int lineNumber = token.getLineNumber();

		// skip the "set" token
		stream.next();

		// use the built in expression parser to parse the variable name
		String name = parser.getExpressionParser().parseNewVariableName();

		stream.expect(Token.Type.PUNCTUATION, "=");

		// use the built in expression parser to parse the variable value
		Expression<?> value = parser.getExpressionParser().parseExpression();

		// expect to see "%}"
		stream.expect(Token.Type.EXECUTE_END);

		// NodeSet is composed of a name and a value
		return new SetNode(lineNumber, name, value);
	}

}
```
The `getTag()` method must return the name of the tag. Pebble's main parser will use this name to determine
when to delegate responsibility to your custom `TokenParser`. This example is parsing the `set` tag.

The parse method is invoked whenever the primary parser encounters a set token. This method should return
one `RenderableNode` instance which when rendered during the template evaluation, will write output to the
provided Writer object. If the `RenderableNode` contains children nodes, it should invoke the render method
of those nodes as well.

The best way to learn all the details of parsing is to look at some of the tools used, as well as some examples.
Here is a list of classes I suggest reading:
- `TokenParser`
- `Parser`
- `SetTokenParser`
- `ForTokenParser`
- `IfNode`
- `SetNode`

## Attribute resolver (v3 only)
To create a new attribute resolver, implement the `getAttributeResolver()` method of your extension which will return a list of
attribute resolvers to run. A attribute resolver implementation must implement the `AttributeResolver` interface.
The	`AttributeResolver` interface requires one method to be implemented, `resolve()`.

The custom attribute resolver will be executed before all default pebble attribute resolvers. It replaces the
`DynamicAttributeProvider` interface

```java
public class DefaultAttributeResolver implements AttributeResolver {

  @Override
  public ResolvedAttribute resolve(Object instance,
                                   Object attributeNameValue,
                                   Object[] argumentValues,
                                   boolean isStrictVariables,
                                   String filename,
                                   int lineNumber) {
    if (instance instanceof CustomObject) {
      return "customValue";
    }
    return null;
  }
}
```


================================================
FILE: docs/src/orchid/resources/wiki/guide/high-performance.md
================================================
---
---

# High Performance


## Concurrency
First and foremost, a `PebbleTemplate` object, once compiled, is completely thread safe. As long as the data backing
the template is also thread safe, you can render that single template instance using multiple threads at once.

The actual rendering of a template will typically occur in a sequential manner, from top to bottom. If, however,
you provide an `ExecutorService` to the `PebbleEngine` and make use of the {{ anchor('parallel') }} tag, you can
have multiple threads render different sections of your template at one time. This is especially useful if one section
of your template is costly and will otherwise block the rendering of the rest of the template.

## Streaming
The use of the {{ anchor('flush') }} tag can be used to stream the rendered output as it's being rendered.
This can significantly improve latency.

## Performance Pitfalls
- It is typically okay for a block to use the `flush` tag unless the contents of that block is being rendered using the {{ anchor('block') }} function. Typically the flush tag will flush to the `Writer` that you provided but the block function internally uses it's own `StringWriter` and therefore flushing will do no good.

================================================
FILE: docs/src/orchid/resources/wiki/guide/installation.md
================================================
---
---

# Installation & Configuration
## Installation
Pebble is hosted in the Maven Central Repository. Simply add the following dependency into your `pom.xml` file:
```xml
<dependency>
	<groupId>io.pebbletemplates</groupId>
	<artifactId>pebble</artifactId>
	<version>{{ site.version }}</version>
</dependency>
```

Also, snapshots of the master branch are deployed automatically with each successful commit. Instead of Maven Central, use the Sonatype snapshots repository at:
```xml
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
```
You can add the repository in your pom.xml

```xml
<repositories>
  <repository>
    <id>sonatype-public</id>
    <name>Sonatype Public</name>
    <url>https://oss.sonatype.org/content/groups/public</url>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
  </repository>
</repositories>
```

## Set Up
If you are integrating Pebble with Spring MVC, read {{ anchor('this guide', 'Spring Integration') }}.

You will want to begin by creating a `PebbleEngine` which is responsible for coordinating the retrieval and
compilation of your templates:
```java
PebbleEngine engine = new PebbleEngine.Builder().build();
```
And now, with your new `PebbleEngine` instance you can start compiling templates:
```java
PebbleTemplate compiledTemplate = engine.getTemplate("templateName");
```
Finally, simply provide your compiled template with a `Writer` object and a Map of variables to get your output!
```java
Writer writer = new StringWriter();

Map<String, Object> context = new HashMap<>();
context.put("name", "Mitchell");

compiledTemplate.evaluate(writer, context);

String output = writer.toString();
```

## Template Loader
The `PebbleEngineBuilder` will also accept a `Loader` implementation as an argument. A loader is responsible for
finding your templates.

Pebble ships with the following loader implementations:

- `DelegatingLoader`: Delegates responsibility to a collection of children loaders.
- `ClasspathLoader`: Uses a classloader to search the current classpath.
- `FileLoader`:  Finds templates using a filesystem path. Must provide a mandatory absolute base path.
- `ServletLoader`:  Uses a servlet context to find the template. This is the recommended loader for use within an
application server but is not enabled by default.
- `Servlet5Loader`:  Same as `ServletLoader`, but for Jakarta Servlet 5.0 or newer.
- `MemoryLoader`: Loader that supports inheritance and doesn't require a filesystem. This is useful for applications
- `StringLoader`: Considers the name of the template to be the contents of the template. Should not be used in a production environment. It is primarily for testing and debugging. Many tags may not work when using this loader, such as "extends", "imports", etc.
  that retrieve templates from a database for example.

If you do not provide a custom Loader, Pebble will use an instance of the `ClasspathLoader` by default.

## Pebble Engine Settings

All the settings are set during the construction of the `PebbleEngine` object.

| Setting  | Description | Default |
| --- | --- | --- |
| `cacheActive` | Flag to activate/desactivate template caching | true |
| `templateCache` | An implementation of a ConcurrentMap cache that the Pebble engine will use to cache compiled templates. | Default implementation is `ConcurrentMapTemplateCache` and another implementation based on Caffeine is available (`CaffeineTemplateCache`) |
| `tagCache` | An implementation of a ConcurrentMap cache that the Pebble engine will use for {{ anchor('cache tag', 'cache') }}. | Default implementation is `ConcurrentMapTagCache` and another implementation based on Caffeine is available (`CaffeineTagCache`) |
| `defaultLocale` | The default locale which will be passed to each compiled template. The templates then use this locale for functions such as i18n, etc. A template can also be given a unique locale during evaluation.  | `Locale.getDefault()` |
| `executorService` | An `ExecutorService` that allows the usage of some advanced multithreading features, such as the `parallel` tag. | `null` |
| `loader` | An implementation of the `Loader` interface which is used to find templates. | An implementation of the `ClasspathLoader` |
| `strictVariables` | If set to true, Pebble will throw an exception if you try to access a variable or attribute that does not exist (or an attribute of a null variable). If set to false, your template will treat non-existing variables/attributes as null without ever skipping a beat. | `false` |
| `methodAccessValidator` | Pebble provides two implementations. NoOpMethodAccessValidator which do nothing and BlacklistMethodAccessValidator which checks that the method being called is not blacklisted. | `BlacklistMethodAccessValidator` 
| `literalDecimalTreatedAsInteger` | option for treating literal decimals as `int`. Otherwise it is `long`. | `false` |
| `literalNumbersAsBigDecimals` | option for toggling to enable/disable literal numbers treated as BigDecimals | `false` |
| `greedyMatchMethod` | option for toggling to enable/disable greedy matching mode for finding java method. Reduce the limit of the parameter type, try to find other method which has compatible parameter types. | `false` |
| `maxRenderedSize` | option for limiting the size of the rendered output | `-1 (disabled)` |


================================================
FILE: docs/src/orchid/resources/wiki/guide/spring-boot-integration.md
================================================
---
---

# Pebble Spring Boot Starter
Spring Boot starter for autoconfiguring Pebble.

## Basic Usage
Add the starter dependency to your pom.xml:

### spring-boot v4
```XML
<dependency>
	<groupId>io.pebbletemplates</groupId>
	<artifactId>pebble-spring-boot-starter</artifactId>
	<version>{{ site.version }}</version>
</dependency>
```
Or build.gradle:
```groovy
compile "io.pebbletemplates:pebble-spring-boot-starter:{{ site.version }}"
```

### spring-boot v3
```XML
<dependency>
	<groupId>io.pebbletemplates</groupId>
	<artifactId>pebble-legacy-spring-boot-starter</artifactId>
	<version>{{ site.version }}</version>
</dependency>
```
Or build.gradle:
```groovy
compile "io.pebbletemplates:pebble-legacy-spring-boot-starter:{{ site.version }}"
```

This is enough for autoconfiguration to kick in. This includes:

* a Loader that will pick template files ending in ``.peb`` from ``/templates/`` dir on the classpath
* a PebbleEngine with default settings, configured with the previous loader
* a Spring extension which offers some functionality described below
* a ViewResolver that will output ``text/html`` in ``UTF-8``

PLEASE NOTE: the starter depends on ``spring-boot-starter-webmvc`` or ``spring-boot-starter-webmvcflux`` but is marked
as optional, you'll need to add the dependency yourself or configure Spring MVC appropriately.

## Boot externalized configuration

A number of properties can be defined in Spring Boot externalized configuration, eg. ``application.properties``,
starting with the prefix ``pebble``. See the
corresponding [PebbleProperties.java](https://github.com/PebbleTemplates/pebble/blob/master/pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleProperties.java)
for your starter version. Notable properties are:

* ``pebble.prefix``: defines the prefix that will be prepended to the mvc view name. Defaults to ``/templates/``
* ``pebble.suffix``: defines the suffix that will be appended to the mvc view name. Defaults to ``.peb``
* ``pebble.charset``: defines the text encoding that will be used to configure the ViewResolver. Defaults to
  ``UTF-8``
* ``pebble.defaultLocale``: defines the default locale that will be used to configure the PebbleEngine. Defaults
  to ``null``
* ``pebble.strictVariables``: enable or disable the strict variable checking in the PebbleEngine. Defaults to
  ``false``
* ``pebble.greedyMatchMethod``: enable or disable the greedy matching mode for finding java method in the
  PebbleEngine. Defaults to ``false``
* ``pebble.servlet.cache``: enables or disables PebbleEngine caches. Defaults to ``true``
* ``pebble.servlet.contentType``: defines the content type that will be used to configure the ViewResolver. Defaults to
  ``text/html``
* ``pebble.servlet.exposeRequestAttributes``: defines whether all request attributes should be added to the model prior
  to merging with the template for the ViewResolver. Defaults to ``false``
* ``pebble.servlet.exposeSessionAttributes``: defines whether all session attributes should be added to the model prior
  to merging with the template for the ViewResolver. Defaults to ``false``
* ``pebble.reactive.mediaTypes``: Configure the supported media types for Pebble views when used in a reactive Spring WebFlux application. This property allows you to specify a list of MediaType objects that the Pebble view resolver should consider when rendering templates. Defaults to ``null``

## Examples
There is the spring petclinic example which has been migrated to [pebble](https://github.com/PebbleTemplates/spring-petclinic) 

There is also a fully working example project located on [github](https://github.com/PebbleTemplates/pebble-example-spring)
which can be used as a reference. It is a very simple and bare-bones project designed to only portray the basics.
To build the project, simply run `mvn install` and then deploy the resulting war file to a an application container.

## Customizing Pebble
### Pebble extensions
Extensions defined as beans will be picked up and added to the PebbleEngine automatically:
```java
@Bean
public Extension myPebbleExtension1() {
   return new MyPebbleExtension1();
}

@Bean
public Extension myPebbleExtension2() {
   return new MyPebbleExtension2();
}
```
CAVEAT: Spring will not gather all the beans if they're scattered across multiple @Configuration classes. If you use this mechanism, bundle all Extension @Beans in a single @Configuration class.

### Customizing the Loader
The autoconfigurer looks for a bean named ``pebbleLoader`` in the context. You can define a custom loader with that name and it will be used to configure the default PebbleEngine:
```java
@Bean
public Loader<?> pebbleLoader() {
   return new MyCustomLoader();
}
```
**PLEASE NOTE**: this loader's prefix and suffix will be both overwritten when the ViewResolver is configured. You should use the externalized configuration for changing these properties.

### Customizing the PebbleEngine
Likewise, you can build a custom engine and make it the default by using the bean name ``pebbleEngine``:
```java
@Bean
public PebbleEngine pebbleEngine() {
   return new PebbleEngine.Builder().build();
}
```

### Customizing the MethodAccessValidator
You can provide your own MethodAccessValidator or switch to NoOpMethodAccessValidator by providing a MethodAccessValidator Bean
```java
@Bean
public MethodAccessValidator methodAccessValidator() {
  return new NoOpMethodAccessValidator();
}
```

### Customizing the ViewResolver
And the same goes for the ViewResolver
```java
@Bean
public PebbleViewResolver pebbleViewResolver() {
   return new PebbleViewResolver();
}
```

For reactive app
```java
@Bean
public PebbleReactiveViewResolver pebbleReactiveViewResolver() {
   return new PebbleReactiveViewResolver(...)
}
```

PLEASE NOTE: you need to change the Loader's prefix and suffix to match the custom ViewResolver's values.

## Features
### Access to Spring beans
Spring beans are available to the template.
```twig
{% verbatim %}{{ beans.beanName }}{% endverbatim %}
```

### Access to http request
HttpServletRequest object is available to the template.
```twig
{% verbatim %}{{ request.contextPath }}{% endverbatim %}
```

### Access to http response
HttpServletResponse is available to the template.
```twig
{% verbatim %}{{ response.contentType }}{% endverbatim %}
```

### Access to http session
HttpSession is available to the template.
```twig
{% verbatim %}{{ session.maxInactiveInterval }}{% endverbatim %}
```

## Spring extension

This extension has many functions for spring validation and the use of message bundle.

### Href function
Function to automatically add the context path to a given url

```twig
{% verbatim %}<a href="{{ href('/foobar') }}">Example</a>{% endverbatim %}
```

### Message function
It achieves the same thing as the i18n function, but instead, it uses the configured spring messageSource, typically the ResourceBundleMessageSource.

```twig
{% verbatim %}
Label = {{ message('label.test') }}
Label with params = {{ message('label.test.params', 'params1', 'params2') }}
{%- endverbatim %}
```

### Spring validations and error messages
6 validations methods and error messages are exposed using spring BindingResult. It needs as a parameter the form name and for a particular field, the field name.

To check if there's any error:
```twig
{% verbatim %}
{{ hasErrors('formName') }}

{{ hasGlobalErrors('formName') }}

{{ hasFieldErrors('formName', 'fieldName') }}
{%- endverbatim %}
```

To output any error:
```twig
{% verbatim %}
{% for err in getAllErrors('formName') %}
    <p>{{ err }}</p>
{% endfor %}

{% for err in getGlobalErrors('formName') %}
    <p>{{ err }}</p>
{% endfor %}

{% for err in getFieldErrors('formName', 'fieldName') %}
    <p>{{ err }}</p>
{% endfor %}
{%- endverbatim %}
```

### Using Pebble for other tasks
The main role of this starter is to configure Pebble for generating MVC View results (the typical HTML). You may define more PebbleEngine/Loader beans for other usage patterns (like generating email bodies). Bear in mind that you should not reuse the default Loader for other Engine instances.



================================================
FILE: docs/src/orchid/resources/wiki/operator/comparisons.md
================================================
# Comparisons
Pebble provides the following comparison operators: `==`, `!=`, `<`, `>`, `<=`, `>=`. All of them except for `==`
are equivalent to their Java counterparts. The `==` operator uses `java.util.Objects.equals(a, b)` behind the
scenes to perform null safe value comparisons.

> `equals` is an alias for `==`

```twig
{% if user.name equals "Mitchell" %}
	...
{% endif %}
```


================================================
FILE: docs/src/orchid/resources/wiki/operator/contains.md
================================================
# `contains`
The `contains` operator can be used to determine if a collection, map, or array contains a particular item.
```twig
{% if ["apple", "pear", "banana"] contains "apple" %}
	...
{% endif %}
```
When using maps, the contains operator checks for an existing key.
```twig
{% if {"apple":"red", "banana":"yellow"} contains "banana" %}
	...
{% endif %}
```
The operator can be used to look for multiple items at once:
```twig
{% if ["apple", "pear", "banana", "peach"] contains ["apple", "peach"] %}
	...
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/operator/is.md
================================================
---
---

# `is`
The `is` operator will apply a test to a variable which will return a boolean.

```twig
{% verbatim %}
{% if 2 is even %}
	...
{% endif %}
{%- endverbatim %}
```
The result can be negated using the {{ anchor('not', 'logic') }} operator.

================================================
FILE: docs/src/orchid/resources/wiki/operator/logic.md
================================================
# Logic

The `and` operator and the `or` operator are available to join boolean expressions.
```twig
{% if 2 is even and 3 is odd %}
	...
{% endif %}
```
The `not` operator is available to negate a boolean expression.
```twig
{% if 3 is not even %}
	...
{% endif %}
```
Parenthesis can be used to group expressions to ensure a desired precedence.
```twig
{% if (3 is not even) and (2 is odd or 3 is even) %}
	...
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/operator/math.md
================================================
---
---

# Math
All the regular math operators are available for use. Order of operations applies.
```twig
{% verbatim %}
{{ 2 + 2 / ( 10 % 3 ) * (8 - 1) }}
{% endverbatim %}
```
The result can be negated using the {{ anchor('not', 'logic') }} operator.

================================================
FILE: docs/src/orchid/resources/wiki/operator/others.md
================================================
# Other Operators
The `|` operator is used to apply a filter to a variable.
```twig
{{ user.name | capitalize }}
```
Pebble supports the use of the conditional operator (often named the ternary operator).
```twig
{{ foo == null ? bar : baz }}
```

================================================
FILE: docs/src/orchid/resources/wiki/summary.md
================================================
## Guides
- [Installation and Configuration](guide/installation.md)
- [Spring Boot Integration](guide/spring-boot-integration.md)
- [Spring petclinic](https://github.com/PebbleTemplates/spring-petclinic)
- [Pebble Spring Example](https://github.com/PebbleTemplates/pebble-example-spring)
- [Basic Usage](guide/basic-usage.md)
- [Customize Defaults](guide/customize-defaults.md)
- [Escaping](guide/escaping.md)
- [Extending Pebble](guide/extending-pebble.md)
- [High Performance Techniques](guide/high-performance.md)

### Tags
- [autoescape](tag/autoescape.md)
- [block](tag/block.md)
- [cache](tag/cache.md)
- [embed](tag/embed.md)
- [extends](tag/extends.md)
- [filter](tag/filter.md)
- [flush](tag/flush.md)
- [for](tag/for.md)
- [from](tag/from.md)
- [if](tag/if.md)
- [import](tag/import.md)
- [include](tag/include.md)
- [macro](tag/macro.md)
- [parallel](tag/parallel.md)
- [set](tag/set.md)
- [verbatim](tag/verbatim.md)

## Filters
- [abbreviate](filter/abbreviate.md)
- [abs](filter/abs.md)
- [base64decode](filter/base64decode.md)
- [base64encode](filter/base64encode.md)
- [capitalize](filter/capitalize.md)
- [date](filter/date.md)
- [default](filter/default.md)
- [escape](filter/escape.md)
- [first](filter/first.md)
- [join](filter/join.md)
- [last](filter/last.md)
- [length](filter/length.md)
- [lower](filter/lower.md)
- [numberformat](filter/numberformat.md)
- [raw](filter/raw.md)
- [replace](filter/replace.md)
- [reverse](filter/reverse.md)
- [rsort](filter/rsort.md)
- [sha256](filter/sha256.md)
- [slice](filter/slice.md)
- [sort](filter/sort.md)
- [split](filter/split.md)
- [title](filter/title.md)
- [trim](filter/trim.md)
- [upper](filter/upper.md)
- [urlencode](filter/urlencode.md)

## Functions
- [block](function/blockFunction.md)
- [i18n](function/i18n.md)
- [max](function/max.md)
- [min](function/min.md)
- [parent](function/parent.md)
- [range](function/range.md)

## Tests
- [empty](test/empty.md)
- [even](test/even.md)
- [map](test/map.md)
- [null](test/null.md)
- [odd](test/odd.md)
- [iterable](test/iterable.md)

## Operators
- [comparisons](operator/comparisons.md) (`==`, `!=`, `<`, `>`, `<=`, `>=`, `equals`)
- [contains](operator/contains.md) (`contains`)
- [is](operator/is.md)
- [logic](operator/logic.md) (`and`, `or`, `not`, `()`)
- [math](operator/math.md) (`+`, `-`, `/`, `%`, `*`)
- [others](operator/others.md) (`|`, `?:`)



================================================
FILE: docs/src/orchid/resources/wiki/tag/autoescape.md
================================================
---
---

# `autoescape`

The `autoescape` tag can be used to temporarily disable/re-enable the autoescaper as well as change the
escaping strategy for a portion of the template.
```twig
{% verbatim %}
{{ danger }} {# will be escaped by default #}
{% autoescape false %}
	{{ danger }} {# will not be escaped #}
{% endautoescape %}
{%- endverbatim %}
```
```twig
{% verbatim %}
{{ danger }} {# will use the "html" escaping strategy #}
{% autoescape "js" %}
	{{ danger }} {# will use the "js" escaping strategy #}
{% endautoescape %}
{%- endverbatim %}
```
Please read the {{ anchor('escaping guide', 'Escaping') }} for more information about escaping.

================================================
FILE: docs/src/orchid/resources/wiki/tag/block.md
================================================
---
---

# `block`
The `block` tag performs two functions. If used in a parent template, it will designate a section as being
allowed to be overriden by a child template. If used in a child template, it will override the content
originally declared in the parent template. See the	{{ anchor('extends') }} tag for a more detailed explanation on how
to implement template inheritance.

The contents of a block will only be used if a child template does not override it. It is often useful to
define empty blocks as placeholders for content to be provided by a child template.

The	`block` tag is immediately followed by the name of the block. This name will be the same name
the child template uses to override it. The `endblock` tag can optionally contain the block's name for readability.

In the following example we create a block with the name 'header':
```twig
{% verbatim %}
{% block header %}
	<h1> Introduction </h1>
{% endblock header %}
{%- endverbatim %}
```
A child template should not have any content outside of blocks. A child template is only used to override
blocks of a parent template.

================================================
FILE: docs/src/orchid/resources/wiki/tag/cache.md
================================================
# `cache`

Cache the rendering portion of a page. Cache name can be an expression or a static string. It uses the cache name and the locale as a key in the cache.

In the following example we create a cache with the name 'menu':
```twig
{% cache 'menu' %}
    {% for item in items %}
        {{ item.text }}
        ....
    {% endfor %}
{% endcache %}
```

Cache implementation can be overriden with the PebbleEngine Builder.
```java
 return new PebbleEngine.Builder()
                .loader(this.templateLoader())
                .tagCache(CacheBuilder.newBuilder().maximumSize(200).build())
                .build();
```


================================================
FILE: docs/src/orchid/resources/wiki/tag/embed.md
================================================
---
---

# `embed`

The `embed` tag allows you to insert the rendered output of another template directly into the current template, while 
overriding some of its blocks. It effectively combines the behavior of {{anchor('include')}} with that of 
{{anchor('extends')}} for creating reusable, yet flexible, template fragments, or for composing micro-layouts.

{% verbatim %}

For example, imagine building a template `card.peb` as a reusable component in your layout. All cards should have the 
same markup, but the content can change drastically throughout your site. `card.peb` might then look like:

```twig
// card.peb
<div class="card">
    {% block cardContent %}
    {% endblock %}
</div>
```

Now, you can include that template elsewhere in your layout, and override the `cardContent` block to "inject" rich 
content into that template at the call-side. For example, you may want to display a grid of your store's most popular 
products as cards, with the last card linking to the full catalog. Embedding `card.peb` and overriding the `cardContent`
block ensures that the markup for both types of cards are always the same, even though what's displayed on each card is 
quite different.

```twig
// layout.peb

{% for product in popularProducts %}
    {% embed 'card.peb' %}
        {% block cardContent %}
            <h1>{{ product.name }}</h1>
            <p>{{ product.description }}</p>
        {% endblock %}
    {% endembed %}
{% endfor %}

{% embed 'card.peb' %}
    {% block cardContent %}
        <a href="...">See all 100+ products</a>
    {% endblock %}
{% endembed %}
```

Embeds can be used multiple times in the same template, and may also be used in a template that itself extends another.
Each template will then maintain its own block hierarchy. In other words, block overridden within the body of the 
`embed` tag will not accidentally override those defined in the main template, and likewise blocks defined in the main
template or its parent templates will not get mixed with those in the embedded template or its parent templates. 

```twig
// main.peb
{% extends 'base.peb' %}

{% block mainContent %}
    {{ parent() }} {# renders mainContent block from base.peb #}
    {{ block('footer') }} {# renders footer block from base.peb, the global page footer #}
    
    {% embed 'card.peb' %}
        {% block mainContent %}
            {{ parent() }} {# renders mainContent block from card.peb #}
            {{ block('footer') }} {# renders footer block from card.peb, the card footer (not the global page footer) #}
        {% endblock %}
    {% endembed %}
{% endblock %}
```

## Scope

Embedded templates will have access to the same variables that the current template does.

```twig
Top Content
{% embed "advertisement" %}{% endembed %}
Bottom Content
{% embed "footer" %}{% endembed %}
```

You can add additional variables to the context of the embedded template by passing a map after the `with` keyword. The embedded template will have access to the same variables that the current template does plus the additional ones defined in the map passed after the `with` keyword:

```twig
{% embed "advertisement" with {"foo":"bar"} %}
    {% block title %}
        Ad with title
    {% endblock %}
    {% block content %}
        Ad with title
    {% endblock %}
{% endembed %}
```

## Dynamic embed
The `embed` tag will accept an expression to determine the template to embed at runtime. For example:
```twig
{% embed admin ? 'adminFooter' : 'defaultFooter' %}
{% endembed %}
```
{% endverbatim %}


================================================
FILE: docs/src/orchid/resources/wiki/tag/extends.md
================================================
# `extends`
The `extends` tag is used to declare a parent template. It should be the very first tag used in a child
template and a child template can only extend up to one parent template.

The best way to understand template inheritance is to study an example. Let us look at a parent
template called "base":
```twig
<html>
	<head>
		<title>{% block title %} {% endblock %}</title>
	</head>
	<body>
		<div id="content">
			{% block content %}
				Default content goes here.
			{% endblock %}
		</div>

		<div id="footer">
			{% block footer %}
				Default footer content
			{% endblock %}
		</div>
	</body>
</html>
```
And now let's look at a child template called "home" which extends "base":
```twig
{% extends "base" %}

{% block title %} Home {% endblock %}

{% block content %}
	Home page content.
{% endblock %}
```
And finally let's look at the resulting output after evaluating "home":
```twig
<html>
	<head>
		<title> Home </title>
	</head>
	<body>
		<div id="content">
			Home page content will override the default content.
		</div>

		<div id="footer">
			Default footer content
		</div>
	</body>
</html>
```
To summarize, parent templates define blocks and child templates will override the contents of those blocks.
If a child template does not override the content of a particular block, the content provided by the parent
template will be used.

There is no limit to how long of an inheritance chain that you can create; i.e. a child template can
itself have a child template. A lot of potential comes from this fact because you can create a hierarchy of
templates to minimize how much content you have to write on the lower levels.

## Dynamic Inheritance
The `extends` tag will accept an expression to determine the parent template at runtime. For example:
```twig
{% extends ajax ? 'ajax' : 'base' %}
```

================================================
FILE: docs/src/orchid/resources/wiki/tag/filter.md
================================================
# `filter`

The `filter` tag allows you to apply a filter to a large chunk of template.
```twig
{% filter upper %}
	hello
{% endfilter %}}

{# output: 'HELLO' #}
```
Multiple filters can be chained together.
```twig
{% filter upper | escape %}
	hello<br>
{% endfilter %}}

{# output: 'HELLO&lt;br&gt;' #}
```

================================================
FILE: docs/src/orchid/resources/wiki/tag/flush.md
================================================
# `flush`
The `flush` tag allows you to flush all currently rendered output to the provided `Writer`.

```twig
{{ headerText }}
{% flush %}
{{ content }}
```

================================================
FILE: docs/src/orchid/resources/wiki/tag/for.md
================================================
# `for`

The `for` tag is used to iterate through primitive arrays or anything that implements the `java.lang.Iterable`
interface, as well as maps.
```twig
{% for user in users %}
	{{ user.name }} lives in {{ user.city }}.
{% endfor %}
```
While inside of the loop, Pebble provides a couple of special variables to help you out:
- loop.index - a zero-based index that increments with every iteration.
- loop.length - the size of the object we are iterating over.
- loop.first - True if first iteration
- loop.last - True if last iteration
- loop.revindex - The number of iterations from the end of the loop

```twig
{% for user in users %}
	{{ loop.index }} - {{ user.id }}
{% endfor %}
```
The `for` tag also provides a convenient way to check if the iterable object is empty with the included `else` tag.
```twig
{% for user in users %}
	{{ loop.index }} - {{ user.id }}
{% else %}
	There are no users to display.
{% endfor %}
```
Iterating over maps can be done like so:
```twig
{% for entry in map %}
    {{ entry.key }} - {{ entry.value }}
{% endfor %}
```

================================================
FILE: docs/src/orchid/resources/wiki/tag/from.md
================================================
---
---

# `from`
The from tag imports {{ anchor('macro') }} names into the current namespace. The tag is documented in detail in the documentation for the {{ anchor('import') }} tag.


================================================
FILE: docs/src/orchid/resources/wiki/tag/if.md
================================================
---
---

# `if`
The `if` tag allows you to designate a chunk of content as conditional depending on the result of an expression
```twig
{% verbatim %}
{% if users is empty %}
	There are no users.
{% elseif users|length == 1 %}
	There is only one user.
{% else %}
	There are many users.
{% endif %}
{%- endverbatim %}
```
The expression used in the `if` statement often makes use of the {{ anchor('is') }} operator.

### Supported conditions

`If` tag currently supports the following expression

| Value  | Boolean expression |
| --- | --- |
| boolean | boolean value |
| Empty string | false |
| Non empty string | true |
| numeric zero | false |
| numeric different than zero | true |


================================================
FILE: docs/src/orchid/resources/wiki/tag/import.md
================================================
---
---

# `import`
The `import` tag allows you to use {{ anchor('macros', 'macro') }} defined in another template.

Assuming that a macro named `input` exists in a template called `form_util` you can import it like so:

```twig
{% verbatim %}
{% import "form_util" %}

{{ input("text", "name", "Mitchell") }}
{%- endverbatim %}
```

The easiest and most flexible is importing the whole module into a variable. That way you can access the attributes:

```twig
{% verbatim %}
{% import 'forms.html' as forms %}

<dl>
    <dt>Username</dt>
    <dd>{{ forms.input('username') }}</dd>
    <dt>Password</dt>
    <dd>{{ forms.input('password', null, 'password') }}</dd>
</dl>
<p>{{ forms.textarea('comment') }}</p>
{%- endverbatim %}
```

Alternatively you can import names from the template into the current namespace:

```twig
{% verbatim %}
{% from 'forms.html' import input as input_field, textarea %}

<dl>
    <dt>Username</dt>
    <dd>{{ input_field('username') }}</dd>
    <dt>Password</dt>
    <dd>{{ input_field('password', '', 'password') }}</dd>
</dl>
<p>{{ textarea('comment') }}</p>
{%- endverbatim %}
```

## Dynamic Import
The `import` tag will accept an expression to determine the template to import at runtime. For example:
```twig
{% verbatim %}
{% import modern ? 'ajax_form_util' : 'simple_form_util' %}

{{ input("text", "name", "Mitchell") }}
{%- endverbatim %}
```

================================================
FILE: docs/src/orchid/resources/wiki/tag/include.md
================================================
# `include`

The `include` tag allows you to insert the rendered output of another template directly into the
current template. The included template will have access to the same variables that the current template does.

```twig
Top Content
{% include "advertisement" %}
Bottom Content
{% include "footer" %}
```

You can add additional variables to the context of the included template by passing a map after the `with` keyword. The included template will have access to the same variables that the current template does plus the additional ones defined in the map passed after the `with` keyword:

```twig
{% include "advertisement" with {"foo":"bar"} %}
```

## Dynamic Include
The `include` tag will accept an expression to determine the template to include at runtime. For example:
```twig
{% include admin ? 'adminFooter' : 'defaultFooter' %}
```


================================================
FILE: docs/src/orchid/resources/wiki/tag/macro.md
================================================
---
---

# `macro`
The `macro` tag allows you to create a chunk of reusable and dynamic content. The macro can be called
multiple times in the current template or even from another template with the help of the {{ anchor('import') }} tag.

It doesn't matter where in the current template you define a macro, i.e. whether it's before or after you call it.
Here is an example of how to define a macro:
```twig
{% verbatim %}
{% macro input(type="text", name, value) %}
	<input type="{{ type }}" name="{{ name }}" value="{{ value }}" />
{% endmacro %}
{%- endverbatim %}
```
And now the macro can be called numerous times throughout the template, like so:
```twig
{% verbatim %}
{{ input(name="country") }}
{# will output: <input type="text" name="country" value="" /> #}
{%- endverbatim %}
```
If the macro resides in another template, use the {{ anchor('import') }} tag first.
```twig
{% verbatim %}
{% import "form_util" %}
{{ input("text", "country", "Canada") }}
{%- endverbatim %}
```
A macro does not have access to the same variables that the rest of the template has access to.
A macro can only work with the variables provided as arguments.

### Access to the global context
You can pass the whole context as an argument by using the special `_context` variable if you need to access
variables outside of the macro scope:
```twig
{% verbatim %}
{% set foo = 'bar' %}

{{ test(_context) }}
{% macro test(_context) %}
	{{ _context.foo }}
{% endmacro %}

{# will output: bar #}
{%- endverbatim %}
```


================================================
FILE: docs/src/orchid/resources/wiki/tag/parallel.md
================================================
---
---

# `parallel`
The `parallel` tag allows you to designate a chunk of content to be rendered using a new thread.
This tag is only available if you provide an `ExecutorService` to the main `PebbleEngine`.

```twig
{% verbatim %}
{{ upperContent }}

{% parallel %}
    {{ calculation.slowCalculation }}
{% endparallel %}

{{ lowerContent }}
{% endverbatim %}
```
In the above example, the slow calculation will not block the `lowerContent` from being evaluated concurrently.

See the {{ anchor('high performance guide', 'High Performance Techniques') }} for more tips on how to improve performance.


================================================
FILE: docs/src/orchid/resources/wiki/tag/set.md
================================================
# `set`
The `set` tag allows you to define a variable in the current context, whether it currently exists or not.
```twig
{% set header = "Test Page" %}

{{ header }}
```

================================================
FILE: docs/src/orchid/resources/wiki/tag/verbatim.md
================================================
# `verbatim`
The `verbatim` tag allows you to write a block of Pebble syntax that won't be parsed.
```twig
{% verbatim %}
	{% for user in users %}
		{{ user.name }}
	{% endfor %}
{% endverbatim %}
```
<br/>
## Inline Verbatim Text

For inline verbatim text, a string literal can be used. For example, if you need to include **{{** in the output of a template, you can use `{{ "{{" }}` in string literal in the Pebble template 

This would be useful if you are using Pebble to generate Angular HTML component template files:

```javascript
<td>{{ "{{" }}school.name{{ "}}" }}</td>
```

would produce the following template output:

```javascript
<td>{{school.name}}</td>
```


================================================
FILE: docs/src/orchid/resources/wiki/test/empty.md
================================================
# `empty`
The `empty` test checks if a variable is empty. A variable is empty if it is null, an empty string, an
empty collection, or an empty map.
```twig
{% if user.email is empty %}
	...
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/test/even.md
================================================
# `even`
The `even` test checks if an integer is even.
```twig
{% if 2 is even %}
	...
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/test/iterable.md
================================================
# `iterable`
The `iterable` test checks if a variable implements `java.lang.Iterable`.
```twig
{% if users is iterable %}
	{% for user in users %}
		...
	{% endfor %}
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/test/map.md
================================================
# `map`
The `map` test checks if a variable is an instance of a map.
```twig
{% if {"apple":"red", "banana":"yellow"} is map %}
	...
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/test/null.md
================================================
# `null`

The `null` test checks if a variable is null.
```twig
{% if user.email is null %}
	...
{% endif %}
```

================================================
FILE: docs/src/orchid/resources/wiki/test/odd.md
================================================
# `odd`
The `odd` test checks if an integer is odd.
```twig
{% if 3 is odd %}
	...
{% endif %}
```

================================================
FILE: intellij-java-google-style.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<code_scheme name="GoogleStyle">
  <option name="OTHER_INDENT_OPTIONS">
    <value>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
      <option name="USE_TAB_CHARACTER" value="false"/>
      <option name="SMART_TABS" value="false"/>
      <option name="LABEL_INDENT_SIZE" value="0"/>
      <option name="LABEL_INDENT_ABSOLUTE" value="false"/>
      <option name="USE_RELATIVE_INDENTS" value="false"/>
    </value>
  </option>
  <option name="INSERT_INNER_CLASS_IMPORTS" value="true"/>
  <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999"/>
  <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999"/>
  <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
    <value/>
  </option>
  <option name="IMPORT_LAYOUT_TABLE">
    <value>
      <package name="" withSubpackages="true" static="true"/>
      <emptyLine/>
      <package name="" withSubpackages="true" static="false"/>
    </value>
  </option>
  <option name="RIGHT_MARGIN" value="100"/>
  <option name="JD_ALIGN_PARAM_COMMENTS" value="false"/>
  <option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false"/>
  <option name="JD_P_AT_EMPTY_LINES" value="false"/>
  <option name="JD_KEEP_EMPTY_PARAMETER" value="false"/>
  <option name="JD_KEEP_EMPTY_EXCEPTION" value="false"/>
  <option name="JD_KEEP_EMPTY_RETURN" value="false"/>
  <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
  <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0"/>
  <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
  <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="0"/>
  <option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
  <option name="ALIGN_MULTILINE_FOR" value="false"/>
  <option name="CALL_PARAMETERS_WRAP" value="1"/>
  <option name="METHOD_PARAMETERS_WRAP" value="1"/>
  <option name="EXTENDS_LIST_WRAP" value="1"/>
  <option name="THROWS_KEYWORD_WRAP" value="1"/>
  <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
  <option name="BINARY_OPERATION_WRAP" value="1"/>
  <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
  <option name="TERNARY_OPERATION_WRAP" value="1"/>
  <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
  <option name="FOR_STATEMENT_WRAP" value="1"/>
  <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
  <option name="WRAP_COMMENTS" value="true"/>
  <option name="IF_BRACE_FORCE" value="3"/>
  <option name="DOWHILE_BRACE_FORCE" value="3"/>
  <option name="WHILE_BRACE_FORCE" value="3"/>
  <option name="FOR_BRACE_FORCE" value="3"/>
  <option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true"/>
  <AndroidXmlCodeStyleSettings>
    <option name="USE_CUSTOM_SETTINGS" value="true"/>
    <option name="LAYOUT_SETTINGS">
      <value>
        <option name="INSERT_BLANK_LINE_BEFORE_TAG" value="false"/>
      </value>
    </option>
  </AndroidXmlCodeStyleSettings>
  <JSCodeStyleSettings>
    <option name="INDENT_CHAINED_CALLS" value="false"/>
  </JSCodeStyleSettings>
  <Python>
    <option name="USE_CONTINUATION_INDENT_FOR_ARGUMENTS" value="true"/>
  </Python>
  <TypeScriptCodeStyleSettings>
    <option name="INDENT_CHAINED_CALLS" value="false"/>
  </TypeScriptCodeStyleSettings>
  <XML>
    <option name="XML_ALIGN_ATTRIBUTES" value="false"/>
    <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true"/>
  </XML>
  <codeStyleSettings language="CSS">
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="ECMA Script Level 4">
    <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
    <option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
    <option name="ALIGN_MULTILINE_FOR" value="false"/>
    <option name="CALL_PARAMETERS_WRAP" value="1"/>
    <option name="METHOD_PARAMETERS_WRAP" value="1"/>
    <option name="EXTENDS_LIST_WRAP" value="1"/>
    <option name="BINARY_OPERATION_WRAP" value="1"/>
    <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
    <option name="TERNARY_OPERATION_WRAP" value="1"/>
    <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
    <option name="FOR_STATEMENT_WRAP" value="1"/>
    <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
    <option name="IF_BRACE_FORCE" value="3"/>
    <option name="DOWHILE_BRACE_FORCE" value="3"/>
    <option name="WHILE_BRACE_FORCE" value="3"/>
    <option name="FOR_BRACE_FORCE" value="3"/>
    <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
  </codeStyleSettings>
  <codeStyleSettings language="HTML">
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="JAVA">
    <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
    <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
    <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1"/>
    <option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
    <option name="ALIGN_MULTILINE_RESOURCES" value="false"/>
    <option name="ALIGN_MULTILINE_FOR" value="false"/>
    <option name="CALL_PARAMETERS_WRAP" value="1"/>
    <option name="METHOD_PARAMETERS_WRAP" value="1"/>
    <option name="EXTENDS_LIST_WRAP" value="1"/>
    <option name="THROWS_KEYWORD_WRAP" value="1"/>
    <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
    <option name="BINARY_OPERATION_WRAP" value="1"/>
    <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
    <option name="TERNARY_OPERATION_WRAP" value="1"/>
    <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
    <option name="FOR_STATEMENT_WRAP" value="1"/>
    <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
    <option name="WRAP_COMMENTS" value="true"/>
    <option name="IF_BRACE_FORCE" value="3"/>
    <option name="DOWHILE_BRACE_FORCE" value="3"/>
    <option name="WHILE_BRACE_FORCE" value="3"/>
    <option name="FOR_BRACE_FORCE" value="3"/>
    <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="JSON">
    <indentOptions>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="JavaScript">
    <option name="RIGHT_MARGIN" value="80"/>
    <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
    <option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
    <option name="ALIGN_MULTILINE_FOR" value="false"/>
    <option name="CALL_PARAMETERS_WRAP" value="1"/>
    <option name="METHOD_PARAMETERS_WRAP" value="1"/>
    <option name="BINARY_OPERATION_WRAP" value="1"/>
    <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
    <option name="TERNARY_OPERATION_WRAP" value="1"/>
    <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
    <option name="FOR_STATEMENT_WRAP" value="1"/>
    <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
    <option name="IF_BRACE_FORCE" value="3"/>
    <option name="DOWHILE_BRACE_FORCE" value="3"/>
    <option name="WHILE_BRACE_FORCE" value="3"/>
    <option name="FOR_BRACE_FORCE" value="3"/>
    <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="PROTO">
    <option name="RIGHT_MARGIN" value="80"/>
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="2"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="protobuf">
    <option name="RIGHT_MARGIN" value="80"/>
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="2"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="Python">
    <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
    <option name="RIGHT_MARGIN" value="80"/>
    <option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
    <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="SASS">
    <indentOptions>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="SCSS">
    <indentOptions>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="TypeScript">
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="XML">
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="2"/>
      <option name="TAB_SIZE" value="2"/>
    </indentOptions>
    <arrangement>
      <rules>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>xmlns:android</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>^$</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>xmlns:.*</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>^$</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:id</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>style</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>^$</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>^$</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:.*Style</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_width</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_height</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_weight</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_margin</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_marginTop</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_marginBottom</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_marginStart</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_marginEnd</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_marginLeft</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_marginRight</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:layout_.*</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:padding</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:paddingTop</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:paddingBottom</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:paddingStart</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:paddingEnd</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:paddingLeft</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*:paddingRight</NAME>
                <XML_ATTRIBUTE/>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*</NAME>
                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*</NAME>
                <XML_NAMESPACE>http://schemas.android.com/apk/res-auto</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*</NAME>
                <XML_NAMESPACE>http://schemas.android.com/tools</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
        <section>
          <rule>
            <match>
              <AND>
                <NAME>.*</NAME>
                <XML_NAMESPACE>.*</XML_NAMESPACE>
              </AND>
            </match>
            <order>BY_NAME</order>
          </rule>
        </section>
      </rules>
    </arrangement>
  </codeStyleSettings>
  <Objective-C>
    <option name="INDENT_NAMESPACE_MEMBERS" value="0"/>
    <option name="INDENT_C_STRUCT_MEMBERS" value="2"/>
    <option name="INDENT_CLASS_MEMBERS" value="2"/>
    <option name="INDENT_VISIBILITY_KEYWORDS" value="1"/>
    <option name="INDENT_INSIDE_CODE_BLOCK" value="2"/>
    <option name="KEEP_STRUCTURES_IN_ONE_LINE" value="true"/>
    <option name="FUNCTION_PARAMETERS_WRAP" value="5"/>
    <option name="FUNCTION_CALL_ARGUMENTS_WRAP" value="5"/>
    <option name="TEMPLATE_CALL_ARGUMENTS_WRAP" value="5"/>
    <option name="TEMPLATE_CALL_ARGUMENTS_ALIGN_MULTILINE" value="true"/>
    <option name="ALIGN_INIT_LIST_IN_COLUMNS" value="false"/>
    <option name="SPACE_BEFORE_SUPERCLASS_COLON" value="false"/>
  </Objective-C>
  <Objective-C-extensions>
    <option name="GENERATE_INSTANCE_VARIABLES_FOR_PROPERTIES" value="ASK"/>
    <option name="RELEASE_STYLE" value="IVAR"/>
    <option name="TYPE_QUALIFIERS_PLACEMENT" value="BEFORE"/>
    <file>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function"/>
    </file>
    <class>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod"/>
      <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod"/>
    </class>
    <extensions>
      <pair source="cc" header="h"/>
      <pair source="c" header="h"/>
    </extensions>
  </Objective-C-extensions>
  <codeStyleSettings language="ObjectiveC">
    <option name="RIGHT_MARGIN" value="80"/>
    <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1"/>
    <option name="BLANK_LINES_BEFORE_IMPORTS" value="0"/>
    <option name="BLANK_LINES_AFTER_IMPORTS" value="0"/>
    <option name="BLANK_LINES_AROUND_CLASS" value="0"/>
    <option name="BLANK_LINES_AROUND_METHOD" value="0"/>
    <option name="BLANK_LINES_AROUND_METHOD_IN_INTERFACE" value="0"/>
    <option name="ALIGN_MULTILINE_BINARY_OPERATION" value="false"/>
    <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
    <option name="FOR_STATEMENT_WRAP" value="1"/>
    <option name="ASSIGNMENT_WRAP" value="1"/>
    <indentOptions>
      <option name="INDENT_SIZE" value="2"/>
      <option name="CONTINUATION_INDENT_SIZE" value="4"/>
    </indentOptions>
  </codeStyleSettings>
</code_scheme>

================================================
FILE: pebble/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>io.pebbletemplates</groupId>
    <artifactId>pebble-project</artifactId>
    <version>4.1.2-SNAPSHOT</version>
  </parent>

  <artifactId>pebble</artifactId>

  <packaging>jar</packaging>
  <name>Pebble</name>

  <description>Templating engine for Java.</description>
  <url>http://pebbletemplates.io</url>

  <properties>
    <unbescape.version>1.1.6.RELEASE</unbescape.version>
    <slf4j.version>2.0.17</slf4j.version>
    <caffeine.version>3.2.3</caffeine.version>
    <jakarata.servlet-api.version>6.1.0</jakarata.servlet-api.version>
    <servlet-api.version>2.5</servlet-api.version>

    <assertj.version>3.27.7</assertj.version>
    <logback-classic.version>1.5.32</logback-classic.version>
    <junit-jupiter.version>6.0.3</junit-jupiter.version>
  </properties>

  <dependencies>
    <!-- required dependencies -->
    <dependency>
      <groupId>org.unbescape</groupId>
      <artifactId>unbescape</artifactId>
      <version>${unbescape.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <!-- optional dependencies -->
    <dependency>
      <groupId>com.github.ben-manes.caffeine</groupId>
      <artifactId>caffeine</artifactId>
      <version>${caffeine.version}</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>${servlet-api.version}</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <artifactId>jakarta.servlet-api</artifactId>
      <groupId>jakarta.servlet</groupId>
      <version>${jakarata.servlet-api.version}</version>
      <optional>true</optional>
    </dependency>

    <!-- testing dependencies -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback-classic.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>${junit-jupiter.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>${assertj.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-maven-plugin</artifactId>
        <version>7.2.3</version>
        <executions>
          <execution>
            <id>generate-osgi-manifest</id>
            <goals>
              <goal>bnd-process</goal>
            </goals>
            <configuration>
              <bnd><![CDATA[
                Bundle-SymbolicName: io.pebbletemplates.pebble
                Automatic-Module-Name: io.pebbletemplates
                Import-Package: \
                  com.github.benmanes.caffeine.*;version="[3.2,4)";resolution:=optional, \
                  javax.servlet;version="[2.5,5)";resolution:=optional, \
                  jakarta.servlet;version="[6.1,7)";resolution:=optional, \
                  *
                -exportcontents: *;-noimport:=true
                -noextraheaders: true
              ]]></bnd>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


================================================
FILE: pebble/src/main/java/io/pebbletemplates/pebble/PebbleEngine.java
================================================
/*
 * This file is part of Pebble.
 * <p>
 * Copyright (c) 2014 by Mitchell Bösecke
 * <p>
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
package io.pebbletemplates.pebble;


import io.pebbletemplates.pebble.attributes.methodaccess.BlacklistMethodAccessValidator;
import io.pebbletemplates.pebble.attributes.methodaccess.MethodAccessValidator;
import io.pebbletemplates.pebble.cache.CacheKey;
import io.pebbletemplates.pebble.cache.PebbleCache;
import io.pebbletemplates.pebble.cache.tag.ConcurrentMapTagCache;
import io.pebbletemplates.pebble.cache.tag.NoOpTagCache;
import io.pebbletemplates.pebble.cache.template.ConcurrentMapTemplateCache;
import io.pebbletemplates.pebble.cache.template.NoOpTemplateCache;
import io.pebbletemplates.pebble.error.LoaderException;
import io.pebbletemplates.pebble.extension.*;
import io.pebbletemplates.pebble.extension.escaper.EscapingStrategy;
import io.pebbletemplates.pebble.lexer.LexerImpl;
import io.pebbletemplates.pebble.lexer.Syntax;
import io.pebbletemplates.pebble.lexer.TokenStream;
import io.pebbletemplates.pebble.loader.ClasspathLoader;
import io.pebbletemplates.pebble.loader.Loader;
import io.pebbletemplates.pebble.loader.StringLoader;
import io.pebbletemplates.pebble.node.RootNode;
import io.pebbletemplates.pebble.parser.Parser;
import io.pebbletemplates.pebble.parser.ParserImpl;
import io.pebbletemplates.pebble.parser.ParserOptions;
import io.pebbletemplates.pebble.template.EvaluationOptions;
import io.pebbletemplates.pebble.template.PebbleTemplate;
import io.pebbletemplates.pebble.template.PebbleTemplateImpl;
import io.pebbletemplates.pebble.utils.TypeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.Reader;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.function.Function;

/**
 * The main class used for compiling templates. The PebbleEngine is responsible for delegating
 * responsibility to the lexer, parser, compiler, and template cache.
 *
 * @author Mitchell
 */
public class PebbleEngine {

  private final Logger logger = LoggerFactory.getLogger(PebbleEngine.class);
	
  private final Loader<?> loader;

  private final Syntax syntax;

  private final boolean strictVariables;

  private final Locale defaultLocale;

  private final int maxRenderedSize;

  private final PebbleCache<CacheKey, Object> tagCache;

  private final ExecutorService executorService;

  private final PebbleCache<Object, PebbleTemplate> templateCache;

  private final ExtensionRegistry extensionRegistry;

  private final ParserOptions parserOptions;

  private final EvaluationOptions evaluationOptions;

  /**
   * Constructor for the Pebble Engine given an instantiated Loader. This method does only load
   * those userProvidedExtensions listed here.
   *
   * @param loader The template loader for this engine
   * @param syntax the syntax to use for parsing the templates.
   */
  private PebbleEngine(Loader<?> loader,
      Syntax syntax,
      boolean strictVariables,
      Locale defaultLocale,
      int maxRenderedSize,
      PebbleCache<CacheKey, Object> tagCache,
      PebbleCache<Object, PebbleTemplate> templateCache,
      ExecutorService executorService,
      ExtensionRegistry extensionRegistry,
      ParserOptions parserOptions,
      EvaluationOptions evaluationOptions) {

    this.loader = loader;
    this.syntax = syntax;
    this.strictVariables = strictVariables;
    this.defaultLocale = defaultLocale;
    this.maxRenderedSize = maxRenderedSize;
    this.tagCache = tagCache;
    this.executorService = executorService;
    this.templateCache = templateCache;
    this.extensionRegistry = extensionRegistry;
    this.parserOptions = parserOptions;
    this.evaluationOptions = evaluationOptions;
  }

  /**
   * Loads, parses, and compiles a template into an instance of PebbleTemplate and returns this
   * instance.
   *
   * @param templateName The name of the template
   * @return PebbleTemplate The compiled version of the template
   */
  public PebbleTemplate getTemplate(String templateName) {
    return this.getTemplate(templateName, this.loader);
  }

  /**
   * Loads, parses, and compiles a template using a StringLoader into an instance of PebbleTemplate
   * and returns this instance.
   *
   * @param templateName The name of the template
   * @return PebbleTemplate The compiled version of the template
   */
  public PebbleTemplate getLiteralTemplate(String templateName) {
    return this.getTemplate(templateName, new StringLoader());
  }

  private PebbleTemplate getTemplate(String templateName, Loader loader) {
    /*
     * template name will be null if user uses the extends tag with an
     * expression that evaluates to null
     */
    if (templateName == null) {
      return null;
    }

    if (loader == null) {
      throw new LoaderException(null, "Loader has not yet been specified.");
    }

    Object cacheKey = loader.createCacheKey(templateName);
    return this.templateCache
        .computeIfAbsent(cacheKey, k -> this.getPebbleTemplate(templateName, loader, cacheKey));
  }

  private PebbleTemplate getPebbleTemplate(String templateName, Loader loader, Object cacheKey) {

    Reader templateReader = loader.getReader(cacheKey);
    
    try {
      this.logger.trace("Tokenizing template named {}", templateName);
      LexerImpl lexer = new LexerImpl(this.syntax,
          this.extensionRegistry.getUnaryOperators().values(),
          this.extensionRegistry.getBinaryOperators().values());
      TokenStream tokenStream = lexer.tokenize(templateReader, templateName);
      this.logger.trace("TokenStream: {}", tokenStream);
      
      Parser parser = new ParserImpl(this.extensionRegistry.getUnaryOperators(),
          this.extensionRegistry.getBinaryOperators(), this.extensionRegistry.getTokenParsers(),
              this.parserOptions);
      RootNode root = parser.parse(tokenStream);

      PebbleTemplateImpl instance = new PebbleTemplateImpl(this, root, templateName);

      for (NodeVisitorFactory visitorFactory : this.extensionRegistry.getNodeVisitors()) {
        visitorFactory.createVisitor(instance).visit(root);
      }

      return instance;

    } finally {
      try {
        templateReader.close();
      } catch (IOException e) {
        // can't do much about it
      }
    }
  }

  /**
   * Returns the loader
   *
   * @return The loader
   */
  public Loader<?> getLoader() {
    return this.loader;
  }

  /**
   * Returns the template cache
   *
   * @return The template cache
   */
  public PebbleCache<Object, PebbleTemplate> getTemplateCache() {
    return this.templateCache;
  }

  /**
   * Returns the strict variables setting
   *
   * @return The strict variables setting
   */
  public boolean isStrictVariables() {
    return this.strictVariables;
  }

  /**
   * Returns the default locale
   *
   * @return The default locale
   */
  public Locale getDefaultLocale() {
    return this.defaultLocale;
  }

  /**
   * Returns the max rendered size.
   *
   *  @return The max rendered size.
   */
  public int getMaxRenderedSize() {
    return this.maxRenderedSize;
  }

  /**
   * Returns the executor service
   *
   * @return The executor service
   */
  public ExecutorService getExecutorService() {
    return this.executorService;
  }

  /**
   * Returns the syntax which is used by this PebbleEngine.
   *
   * @return the syntax used by the PebbleEngine.
   */
  public Syntax getSyntax() {
    return this.syntax;
  }

  /**
   * Returns the extension registry.
   *
   * @return The extension registry
   */
  public ExtensionRegistry getExtensionRegistry() {
    return this.extensionRegistry;
  }

  /**
   * Returns the tag cache
   *
   * @return The tag cache
   */
  public PebbleCache<CacheKey, Object> getTagCache() {
    return this.tagCache;
  }

  /**
   * A builder to configure and construct an instance of a PebbleEngine.
   */
  public static class Builder {

    private Loader<?> loader;

    private Syntax syntax;

    private boolean strictVariables = false;

    private boolean enableNewLineTrimming = true;

    private Locale defaultLocale;

    private int maxRenderedSize = -1;

    private ExecutorService executorService;

    private PebbleCache<Object, PebbleTemplate> templateCache;

    private boolean cacheActive = true;

    private PebbleCache<CacheKey, Object> tagCache;

    private boolean literalDecimalTreatedAsInteger = false;

    private boolean greedyMatchMethod = false;

    private boolean literalNumbersAsBigDecimals = false;

    private MethodAccessValidator methodAccessValidator = new BlacklistMethodAccessValidator();

    private final ExtensionRegistryFactory factory = new ExtensionRegistryFactory();

    /**
     * Creates the builder.
     */
    public Builder() {

    }

    /**
     * Sets the loader used to find templates.
     *
     * @param loader A template loader
     * @return This builder object
     */
    public Builder loader(Loader<?> loader) {
      this.loader = loader;
      return this;
    }

    /**
     * Adds an extension, can be safely invoked several times to add different extensions.
     *
     * @param extensions One or more extensions to add
     * @return This builder object
     */
    public Builder extension(Extension... extensions) {
      this.factory.extension(extensions);
      return this;
    }

    /**
     * Sets the syntax to be used.
     *
     * @param syntax The syntax to be used
     * @return This builder object
     */
    public Builder syntax(Syntax syntax) {
      this.syntax = syntax;
      return this;
    }

    /**
     * Changes the <code>strictVariables</code> setting of the PebbleEngine. The default value of
     * this setting is "false".
     * <p>
     * The following examples will all print empty strings if strictVariables is false but will
     * throw exceptions if it is true:
     * </p>
     * {{ nonExistingVariable }} {{ nonExistingVariable.attribute }} {{ nullVariable.attribute }} {{
     * existingVariable.nullAttribute.attribute }} {{ existingVariable.nonExistingAttribute }} {{
     * array[-1] }}
     *
     * @param strictVariables Whether or not strict variables is used
     * @return This builder object
     */
    public Builder strictVariables(boolean strictVariables) {
      this.strictVariables = strictVariables;
      return this;
    }

    /**
     * Changes the <code>newLineTrimming</code> setting of the PebbleEngine. The default value of
     * this setting is "true".
     * <p>
     * By default, Pebble will trim a newline that immediately follows a Pebble tag. For example,
     * <code>{{key1}}\n{{key2}}</code> will have the newline removed.
     * </p>
     * <p>
     * If <code>newLineTrimming</code> is set to false, then the first newline following a Pebble
     * tag won't be trimmed.  All newlines will be preserved
     * </p>
     *
     * @param enableNewLineTrimming Whether or not the newline should be trimmed.
     * @return This builder object
     */
    public Builder newLineTrimming(boolean enableNewLineTrimming) {
      this.enableNewLineTrimming = enableNewLineTrimming;
      return this;
    }

    /**
     * Sets the Locale passed to all templates constructed by this PebbleEngine.
     * <p>
     * An individual template can always be given a new locale during evaluation.
     *
     * @param defaultLocale The default locale
     * @return This builder object
     */
    public Builder defaultLocale(Locale defaultLocale) {
      this.defaultLocale = defaultLocale;
      return this;
    }

    /**
     * Sets the maximum size of the rendered template to protect against macro bombs.
     * See for example https://github.com/PebbleTemplates/pebble/issues/526.
     * If the rendered template exceeds this limit, then a PebbleException is thrown.
     * The default value is -1 and it means unlimited.
     * @param maxRenderedSize The maximum allowed size of the rendered template.
     * @return This builder object.
     */
    public Builder maxRenderedSize(int maxRenderedSize) {
      this.maxRenderedSize = maxRenderedSize;
      return this;
    }

    /**
     * Sets the executor service which is required if using one of Pebble's multithreading features
     * such as the "parallel" tag.
     *
     * @param executorService The executor service
     * @return This builder object
     */
    public Builder executorService(ExecutorService executorService) {
      this.executorService = executorService;
      return this;
    }

    /**
     * Sets the cache used by the engine to store compiled PebbleTemplate instances.
     *
     * @param templateCache The template cache
     * @return This builder object
     */
    public Builder templateCache(PebbleCache<Object, PebbleTemplate> templateCache) {
      this.templateCache = templateCache;
      return this;
    }

    /**
     * Sets the cache used by the "cache" tag.
     *
     * @param tagCache The tag cache
     * @return This builder object
     */
    public Builder tagCache(PebbleCache<CacheKey, Object> tagCache) {
      this.tagCache = tagCache;
      return this;
    }

    /**
     * Sets whether or not escaping should be performed automatically. The default value of this
     * setting is "true".
     *
     * @param autoEscaping The auto escaping setting.
     * @return This builder object
     */
    public Builder autoEscaping(boolean autoEscaping) {
      this.factory.autoEscaping(autoEscaping);
      return this;
    }

    /**
     * Sets whether or not core operators overrides should be allowed. The default value of this
     * setting is "false".
     *
     * @param allowOverrideCoreOperators Whether or not core operators overrides should be allowed.
     * @return This builder object
     */
    public Builder allowOverrideCoreOperators(boolean allowOverrideCoreOperators) {
      this.factory.allowOverrideCoreOperators(allowOverrideCoreOperators);
      return this;
    }

    /**
     * Sets the default escaping strategy of the built-in escaper extension.
     *
     * @param strategy The name of the default escaping strategy
     * @return This builder object
     */
    public Builder defaultEscapingStrategy(String strategy) {
      this.factory.defaultEscapingStrategy(strategy);
      return this;
    }

    /**
     * Adds an escaping strategy to the built-in escaper extension.
     *
     * @param name The name of the escaping strategy
     * @param strategy The strategy implementation
     * @return This builder object
     */
    public Builder addEscapingStrategy(String name, EscapingStrategy strategy) {
      this.factory.addEscapingStrategy(name, strategy);
      return this;
    }

    /**
     * Enable/disable all caches, i.e. cache used by the engine to store compiled PebbleTemplate
     * instances and tags cache. The default value of this setting is "true".
     *
     * @param cacheActive toggle to enable/disable all caches
     * @return This builder object
     */
    public Builder cacheActive(boolean cacheActive) {
      this.cacheActive = cacheActive;
      return this;
    }

    /**
     * Validator that can be used to validate object/method access
     *
     * @param methodAccessValidator Validator that can be used to validate object/method access
     * @return This builder object
     */
    public Builder methodAccessValidator(MethodAccessValidator methodAccessValidator) {
      this.methodAccessValidator = methodAccessValidator;
      return this;
    }

    /**
     * Enable/disable treat literal decimal as Integer. Default is disabled, treated as Long.
     *
     * @param literalDecimalTreatedAsInteger toggle to enable/disable literal decimal treated as
     * integer
     * @return This builder object
     */
    public Builder literalDecimalTreatedAsInteger(boolean literalDecimalTreatedAsInteger) {
      this.literalDecimalTreatedAsInteger = literalDecimalTreatedAsInteger;
      return this;
    }

    /**
     * Enable/disable treat literal numbers as BigDecimals. Default is disabled, treated as Long/Double.
     *
     * @param literalNumbersAsBigDecimals toggle to enable/disable literal numbers treated as
     * BigDecimals
     * @return This builder object
     */
    public Builder literalNumbersAsBigDecimals(boolean literalNumbersAsBigDecimals) {
      this.literalNumbersAsBigDecimals = literalNumbersAsBigDecimals;
      return this;
    }

    /**
     * Enable/disable greedy matching mode for finding java method. Default is disabled. If enabled,
     * when can not find perfect method (method name, parameter length and parameter type are all
     * satisfied), reduce the limit of the parameter type, try to find other method which has
     * compatible parameter types.
     *
     * For example,
     * <pre> {{ obj.number(2) }} </pre>
     * the expression can match all of below methods.
     * <pre>
     *   public Long getNumber(Long v) {...}
     *   public Integer getNumber(Integer v) {...}
     *   public Short getNumber(Short v) {...}
     *   public Byte getNumber(Byte v) {...}
     *   ...
     * </pre>
     *
     * @param greedyMatchMethod toggle to enable/disable greedy match method
     * @return This builder object
     * @see TypeUtils#compatibleCast(Object, Class)
     */
    public Builder greedyMatchMethod(boolean greedyMatchMethod) {
      this.greedyMatchMethod = greedyMatchMethod;
      return this;
    }

    /**
     * Registers an implementation of {@link ExtensionCustomizer} to change runtime-behaviour of standard
     * functionality.
     *
     * @param customizer The customizer which wraps any non-user-provided extension
     * @return This build object
     */
    public Builder registerExtensionCustomizer(Function<Extension, ExtensionCustomizer> customizer) {
      this.factory.registerExtensionCustomizer(customizer);
      return this;
    }

    /**
     * Creates the PebbleEngine instance.
     *
     * @return A PebbleEngine object that can be used to create PebbleTemplate objects.
     */
    public PebbleEngine build() {

      ExtensionRegistry extensionRegistry = this.factory.buildExtensionRegistry();

      // default loader
      if (this.loader == null) {
        this.loader = new ClasspathLoader();
      }

      // default locale
      if (this.defaultLocale == null) {
        this.defaultLocale = Locale.getDefault();
      }

      if (this.cacheActive) {
        // default caches
        if (this.templateCache == null) {
          this.templateCache = new ConcurrentMapTemplateCache();
        }

        if (this.tagCache == null) {
          this.tagCache = new ConcurrentMapTagCache();
        }
      } else {
        this.templateCache = new NoOpTemplateCache();
        this.tagCache = new NoOpTagCache();
      }

      if (this.syntax == null) {
        this.syntax = new Syntax.Builder().setEnableNewLineTrimming(this.enableNewLineTrimming)
            .build();
      }

      ParserOptions parserOptions = new ParserOptions();
      parserOptions.setLiteralDecimalTreatedAsInteger(this.literalDecimalTreatedAsInteger);
      parserOptions.setLiteralNumbersAsBigDecimals(this.literalNumbersAsBigDecimals);

      EvaluationOptions evaluationOptions = new EvaluationOptions(this.greedyMatchMethod,
          this.methodAccessValidator);
      return new PebbleEngine(this.loader, this.syntax, this.strictVariables, this.defaultLocale, this.maxRenderedSize,
          this.tagCache, this.templateCache,
          this.executorSer
Download .txt
gitextract_382czipv/

├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   └── issue.md
│   ├── dependabot.yml
│   └── workflows/
│       └── maven.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docs/
│   ├── pom.xml
│   └── src/
│       └── orchid/
│           └── resources/
│               ├── assets/
│               │   └── css/
│               │       └── github-fork-ribbon.css
│               ├── changelog/
│               │   ├── v3_0_0.md
│               │   ├── v3_0_1.md
│               │   ├── v3_0_10.md
│               │   ├── v3_0_2.md
│               │   ├── v3_0_3.md
│               │   ├── v3_0_4.md
│               │   ├── v3_0_5.md
│               │   ├── v3_0_6.md
│               │   ├── v3_0_7.md
│               │   ├── v3_0_8.md
│               │   ├── v3_0_9.md
│               │   ├── v3_1_0.md
│               │   ├── v3_1_1.md
│               │   ├── v3_1_2.md
│               │   ├── v3_1_3.md
│               │   ├── v3_1_4.md
│               │   ├── v3_1_5.md
│               │   ├── v3_1_6.md
│               │   ├── v3_2_0.md
│               │   ├── v3_2_1.md
│               │   ├── v3_2_2.md
│               │   ├── v3_2_3.md
│               │   ├── v3_2_4.md
│               │   ├── v4_0_0.md
│               │   ├── v4_1_0.md
│               │   └── v4_1_1.md
│               ├── config.yml
│               ├── data/
│               │   ├── contributors.yml
│               │   └── twig-compatibility/
│               │       ├── filters.yml
│               │       ├── functions.yml
│               │       ├── operators.yml
│               │       ├── tags.yml
│               │       └── tests.yml
│               ├── homepage.md
│               ├── pages/
│               │   ├── CNAME
│               │   ├── changelog.md
│               │   ├── contributing.md
│               │   └── twig-compatibility.peb
│               ├── templates/
│               │   ├── includes/
│               │   │   └── sidebar.peb
│               │   └── layouts/
│               │       └── index.peb
│               └── wiki/
│                   ├── filter/
│                   │   ├── abbreviate.md
│                   │   ├── abs.md
│                   │   ├── base64decode.md
│                   │   ├── base64encode.md
│                   │   ├── capitalize.md
│                   │   ├── date.md
│                   │   ├── default.md
│                   │   ├── escape.md
│                   │   ├── first.md
│                   │   ├── format.md
│                   │   ├── join.md
│                   │   ├── last.md
│                   │   ├── length.md
│                   │   ├── lower.md
│                   │   ├── nl2br.md
│                   │   ├── numberformat.md
│                   │   ├── raw.md
│                   │   ├── replace.md
│                   │   ├── reverse.md
│                   │   ├── rsort.md
│                   │   ├── sha256.md
│                   │   ├── slice.md
│                   │   ├── sort.md
│                   │   ├── split.md
│                   │   ├── title.md
│                   │   ├── trim.md
│                   │   ├── upper.md
│                   │   └── urlencode.md
│                   ├── function/
│                   │   ├── blockFunction.md
│                   │   ├── i18n.md
│                   │   ├── max.md
│                   │   ├── min.md
│                   │   ├── parent.md
│                   │   └── range.md
│                   ├── guide/
│                   │   ├── basic-usage.md
│                   │   ├── customize-defaults.md
│                   │   ├── escaping.md
│                   │   ├── extending-pebble.md
│                   │   ├── high-performance.md
│                   │   ├── installation.md
│                   │   └── spring-boot-integration.md
│                   ├── operator/
│                   │   ├── comparisons.md
│                   │   ├── contains.md
│                   │   ├── is.md
│                   │   ├── logic.md
│                   │   ├── math.md
│                   │   └── others.md
│                   ├── summary.md
│                   ├── tag/
│                   │   ├── autoescape.md
│                   │   ├── block.md
│                   │   ├── cache.md
│                   │   ├── embed.md
│                   │   ├── extends.md
│                   │   ├── filter.md
│                   │   ├── flush.md
│                   │   ├── for.md
│                   │   ├── from.md
│                   │   ├── if.md
│                   │   ├── import.md
│                   │   ├── include.md
│                   │   ├── macro.md
│                   │   ├── parallel.md
│                   │   ├── set.md
│                   │   └── verbatim.md
│                   └── test/
│                       ├── empty.md
│                       ├── even.md
│                       ├── iterable.md
│                       ├── map.md
│                       ├── null.md
│                       └── odd.md
├── intellij-java-google-style.xml
├── pebble/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── io/
│       │           └── pebbletemplates/
│       │               └── pebble/
│       │                   ├── PebbleEngine.java
│       │                   ├── attributes/
│       │                   │   ├── ArrayResolver.java
│       │                   │   ├── AttributeResolver.java
│       │                   │   ├── DefaultAttributeResolver.java
│       │                   │   ├── ListResolver.java
│       │                   │   ├── MacroResolver.java
│       │                   │   ├── MapResolver.java
│       │                   │   ├── MemberCacheUtils.java
│       │                   │   ├── ResolvedAttribute.java
│       │                   │   └── methodaccess/
│       │                   │       ├── BlacklistMethodAccessValidator.java
│       │                   │       ├── MethodAccessValidator.java
│       │                   │       └── NoOpMethodAccessValidator.java
│       │                   ├── cache/
│       │                   │   ├── CacheKey.java
│       │                   │   ├── PebbleCache.java
│       │                   │   ├── tag/
│       │                   │   │   ├── CaffeineTagCache.java
│       │                   │   │   ├── ConcurrentMapTagCache.java
│       │                   │   │   └── NoOpTagCache.java
│       │                   │   └── template/
│       │                   │       ├── CaffeineTemplateCache.java
│       │                   │       ├── ConcurrentMapTemplateCache.java
│       │                   │       └── NoOpTemplateCache.java
│       │                   ├── error/
│       │                   │   ├── AttributeNotFoundException.java
│       │                   │   ├── ClassAccessException.java
│       │                   │   ├── LoaderException.java
│       │                   │   ├── ParserException.java
│       │                   │   ├── PebbleException.java
│       │                   │   └── RootAttributeNotFoundException.java
│       │                   ├── extension/
│       │                   │   ├── AbstractExtension.java
│       │                   │   ├── AbstractNodeVisitor.java
│       │                   │   ├── Extension.java
│       │                   │   ├── ExtensionCustomizer.java
│       │                   │   ├── ExtensionRegistry.java
│       │                   │   ├── ExtensionRegistryFactory.java
│       │                   │   ├── Filter.java
│       │                   │   ├── Function.java
│       │                   │   ├── NamedArguments.java
│       │                   │   ├── NodeVisitor.java
│       │                   │   ├── NodeVisitorFactory.java
│       │                   │   ├── Test.java
│       │                   │   ├── core/
│       │                   │   │   ├── AbbreviateFilter.java
│       │                   │   │   ├── AbsFilter.java
│       │                   │   │   ├── AttributeResolverExtension.java
│       │                   │   │   ├── Base64DecoderFilter.java
│       │                   │   │   ├── Base64EncoderFilter.java
│       │                   │   │   ├── CapitalizeFilter.java
│       │                   │   │   ├── CoreExtension.java
│       │                   │   │   ├── DateFilter.java
│       │                   │   │   ├── DefaultFilter.java
│       │                   │   │   ├── DefinedTest.java
│       │                   │   │   ├── DisallowExtensionCustomizerBuilder.java
│       │                   │   │   ├── EmptyTest.java
│       │                   │   │   ├── EvenTest.java
│       │                   │   │   ├── FirstFilter.java
│       │                   │   │   ├── FormatFilter.java
│       │                   │   │   ├── IterableTest.java
│       │                   │   │   ├── JoinFilter.java
│       │                   │   │   ├── LastFilter.java
│       │                   │   │   ├── LengthFilter.java
│       │                   │   │   ├── LowerFilter.java
│       │                   │   │   ├── MacroAndBlockRegistrantNodeVisitor.java
│       │                   │   │   ├── MacroAndBlockRegistrantNodeVisitorFactory.java
│       │                   │   │   ├── MapTest.java
│       │                   │   │   ├── MaxFunction.java
│       │                   │   │   ├── MergeFilter.java
│       │                   │   │   ├── MinFunction.java
│       │                   │   │   ├── Nl2brFilter.java
│       │                   │   │   ├── NullTest.java
│       │                   │   │   ├── NumberFormatFilter.java
│       │                   │   │   ├── OddTest.java
│       │                   │   │   ├── RangeFunction.java
│       │                   │   │   ├── ReplaceFilter.java
│       │                   │   │   ├── ReverseFilter.java
│       │                   │   │   ├── RsortFilter.java
│       │                   │   │   ├── Sha256Filter.java
│       │                   │   │   ├── SliceFilter.java
│       │                   │   │   ├── SortFilter.java
│       │                   │   │   ├── SplitFilter.java
│       │                   │   │   ├── TitleFilter.java
│       │                   │   │   ├── TrimFilter.java
│       │                   │   │   ├── UpperFilter.java
│       │                   │   │   └── UrlEncoderFilter.java
│       │                   │   ├── debug/
│       │                   │   │   ├── DebugExtension.java
│       │                   │   │   ├── PrettyPrintNodeVisitor.java
│       │                   │   │   └── PrettyPrintNodeVisitorFactory.java
│       │                   │   ├── escaper/
│       │                   │   │   ├── EscapeFilter.java
│       │                   │   │   ├── EscaperExtension.java
│       │                   │   │   ├── EscaperNodeVisitor.java
│       │                   │   │   ├── EscaperNodeVisitorFactory.java
│       │                   │   │   ├── EscapingStrategy.java
│       │                   │   │   ├── RawFilter.java
│       │                   │   │   └── SafeString.java
│       │                   │   ├── i18n/
│       │                   │   │   ├── I18nExtension.java
│       │                   │   │   ├── UTF8Control.java
│       │                   │   │   └── i18nFunction.java
│       │                   │   └── writer/
│       │                   │       ├── PooledSpecializedStringWriter.java
│       │                   │       ├── SpecializedWriter.java
│       │                   │       └── StringWriterSpecializedAdapter.java
│       │                   ├── lexer/
│       │                   │   ├── Lexer.java
│       │                   │   ├── LexerImpl.java
│       │                   │   ├── Syntax.java
│       │                   │   ├── TemplateSource.java
│       │                   │   ├── Token.java
│       │                   │   └── TokenStream.java
│       │                   ├── loader/
│       │                   │   ├── AbstractServletLoader.java
│       │                   │   ├── ClasspathLoader.java
│       │                   │   ├── DelegatingLoader.java
│       │                   │   ├── DelegatingLoaderCacheKey.java
│       │                   │   ├── FileLoader.java
│       │                   │   ├── Loader.java
│       │                   │   ├── MemoryLoader.java
│       │                   │   ├── Servlet5Loader.java
│       │                   │   ├── ServletLoader.java
│       │                   │   └── StringLoader.java
│       │                   ├── node/
│       │                   │   ├── AbstractRenderableNode.java
│       │                   │   ├── ArgumentsNode.java
│       │                   │   ├── AutoEscapeNode.java
│       │                   │   ├── BlockNode.java
│       │                   │   ├── BodyNode.java
│       │                   │   ├── CacheNode.java
│       │                   │   ├── EmbedNode.java
│       │                   │   ├── ExtendsNode.java
│       │                   │   ├── FlushNode.java
│       │                   │   ├── ForNode.java
│       │                   │   ├── FromNode.java
│       │                   │   ├── FunctionOrMacroNameNode.java
│       │                   │   ├── IfNode.java
│       │                   │   ├── ImportNode.java
│       │                   │   ├── IncludeNode.java
│       │                   │   ├── MacroNode.java
│       │                   │   ├── NamedArgumentNode.java
│       │                   │   ├── Node.java
│       │                   │   ├── ParallelNode.java
│       │                   │   ├── PositionalArgumentNode.java
│       │                   │   ├── PrintNode.java
│       │                   │   ├── RenderableNode.java
│       │                   │   ├── RootNode.java
│       │                   │   ├── SetNode.java
│       │                   │   ├── TestInvocationExpression.java
│       │                   │   ├── TextNode.java
│       │                   │   ├── expression/
│       │                   │   │   ├── AddExpression.java
│       │                   │   │   ├── AndExpression.java
│       │                   │   │   ├── ArrayExpression.java
│       │                   │   │   ├── BinaryExpression.java
│       │                   │   │   ├── BlockFunctionExpression.java
│       │                   │   │   ├── ConcatenateExpression.java
│       │                   │   │   ├── ContainsExpression.java
│       │                   │   │   ├── ContextVariableExpression.java
│       │                   │   │   ├── DivideExpression.java
│       │                   │   │   ├── EqualsExpression.java
│       │                   │   │   ├── Expression.java
│       │                   │   │   ├── FilterExpression.java
│       │                   │   │   ├── FilterInvocationExpression.java
│       │                   │   │   ├── FunctionOrMacroInvocationExpression.java
│       │                   │   │   ├── GetAttributeExpression.java
│       │                   │   │   ├── GreaterThanEqualsExpression.java
│       │                   │   │   ├── GreaterThanExpression.java
│       │                   │   │   ├── LessThanEqualsExpression.java
│       │                   │   │   ├── LessThanExpression.java
│       │                   │   │   ├── LiteralBigDecimalExpression.java
│       │                   │   │   ├── LiteralBooleanExpression.java
│       │                   │   │   ├── LiteralDoubleExpression.java
│       │                   │   │   ├── LiteralIntegerExpression.java
│       │                   │   │   ├── LiteralLongExpression.java
│       │                   │   │   ├── LiteralNullExpression.java
│       │                   │   │   ├── LiteralStringExpression.java
│       │                   │   │   ├── MapExpression.java
│       │                   │   │   ├── ModulusExpression.java
│       │                   │   │   ├── MultiplyExpression.java
│       │                   │   │   ├── NegativeTestExpression.java
│       │                   │   │   ├── NotEqualsExpression.java
│       │                   │   │   ├── OrExpression.java
│       │                   │   │   ├── ParentFunctionExpression.java
│       │                   │   │   ├── PositiveTestExpression.java
│       │                   │   │   ├── RangeExpression.java
│       │                   │   │   ├── RenderableNodeExpression.java
│       │                   │   │   ├── SubtractExpression.java
│       │                   │   │   ├── TernaryExpression.java
│       │                   │   │   ├── UnaryExpression.java
│       │                   │   │   ├── UnaryMinusExpression.java
│       │                   │   │   ├── UnaryNotExpression.java
│       │                   │   │   └── UnaryPlusExpression.java
│       │                   │   └── fornode/
│       │                   │       ├── LazyLength.java
│       │                   │       └── LazyRevIndex.java
│       │                   ├── operator/
│       │                   │   ├── Associativity.java
│       │                   │   ├── BinaryOperator.java
│       │                   │   ├── BinaryOperatorImpl.java
│       │                   │   ├── BinaryOperatorType.java
│       │                   │   ├── UnaryOperator.java
│       │                   │   └── UnaryOperatorImpl.java
│       │                   ├── parser/
│       │                   │   ├── ExpressionParser.java
│       │                   │   ├── Parser.java
│       │                   │   ├── ParserImpl.java
│       │                   │   ├── ParserOptions.java
│       │                   │   └── StoppingCondition.java
│       │                   ├── template/
│       │                   │   ├── Block.java
│       │                   │   ├── EvaluationContext.java
│       │                   │   ├── EvaluationContextImpl.java
│       │                   │   ├── EvaluationOptions.java
│       │                   │   ├── GlobalContext.java
│       │                   │   ├── Hierarchy.java
│       │                   │   ├── Macro.java
│       │                   │   ├── MacroAttributeProvider.java
│       │                   │   ├── PebbleTemplate.java
│       │                   │   ├── PebbleTemplateImpl.java
│       │                   │   ├── RenderedSizeContext.java
│       │                   │   ├── Scope.java
│       │                   │   └── ScopeChain.java
│       │                   ├── tokenParser/
│       │                   │   ├── AutoEscapeTokenParser.java
│       │                   │   ├── BlockTokenParser.java
│       │                   │   ├── CacheTokenParser.java
│       │                   │   ├── EmbedTokenParser.java
│       │                   │   ├── ExtendsTokenParser.java
│       │                   │   ├── FilterTokenParser.java
│       │                   │   ├── FlushTokenParser.java
│       │                   │   ├── ForTokenParser.java
│       │                   │   ├── FromTokenParser.java
│       │                   │   ├── IfTokenParser.java
│       │                   │   ├── ImportTokenParser.java
│       │                   │   ├── IncludeTokenParser.java
│       │                   │   ├── MacroTokenParser.java
│       │                   │   ├── ParallelTokenParser.java
│       │                   │   ├── SetTokenParser.java
│       │                   │   ├── TokenParser.java
│       │                   │   └── VerbatimTokenParser.java
│       │                   └── utils/
│       │                       ├── Callbacks.java
│       │                       ├── FutureWriter.java
│       │                       ├── LimitedSizeWriter.java
│       │                       ├── OperatorUtils.java
│       │                       ├── Pair.java
│       │                       ├── PathUtils.java
│       │                       ├── StringLengthComparator.java
│       │                       ├── StringUtils.java
│       │                       └── TypeUtils.java
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── pebbletemplates/
│           │           └── pebble/
│           │               ├── ArgumentsNodeTest.java
│           │               ├── ArraySyntaxTest.java
│           │               ├── AttributeSubscriptSyntaxTest.java
│           │               ├── CacheTest.java
│           │               ├── CompilerTest.java
│           │               ├── ConcurrencyTest.java
│           │               ├── ContextTest.java
│           │               ├── CoreFiltersTest.java
│           │               ├── CoreFunctionsTest.java
│           │               ├── CoreTagsTest.java
│           │               ├── CoreTestsTest.java
│           │               ├── DynamicNamedArgsTest.java
│           │               ├── EmbedCachingTagTest.java
│           │               ├── EmbedTagTest.java
│           │               ├── EnumEqualsTest.java
│           │               ├── ErrorReportingTest.java
│           │               ├── EscaperExtensionTest.java
│           │               ├── ExtendingPebbleTest.java
│           │               ├── FileLoaderTest.java
│           │               ├── ForTest.java
│           │               ├── GetAttributeTest.java
│           │               ├── I18nExtensionTest.java
│           │               ├── IncludeWithParameterTest.java
│           │               ├── InheritanceTest.java
│           │               ├── LoaderTest.java
│           │               ├── LogicTest.java
│           │               ├── MacroTest.java
│           │               ├── MapSyntaxTest.java
│           │               ├── MaxRenderedSizeTest.java
│           │               ├── MethodAccessTemplateTest.java
│           │               ├── NewlineTrimmingTest.java
│           │               ├── Nl2brFilterTest.java
│           │               ├── OverloadedMethodTest.java
│           │               ├── OverrideCoreExtensionTest.java
│           │               ├── ParsingOdditiesTest.java
│           │               ├── RenderSingleBlockTest.java
│           │               ├── RenderWithoutEndBlockTest.java
│           │               ├── ScopeChainTest.java
│           │               ├── ScopeTest.java
│           │               ├── SplitFilterTest.java
│           │               ├── StrictModeTest.java
│           │               ├── StringInterpolationTest.java
│           │               ├── TernaryExpressionTest.java
│           │               ├── TestParallelParsing.java
│           │               ├── TestRelativePath.java
│           │               ├── WhitespaceControlTest.java
│           │               ├── WritingTest.java
│           │               ├── attributes/
│           │               │   └── methodaccess/
│           │               │       ├── BlacklistMethodAccessValidatorTest.java
│           │               │       ├── Foo.java
│           │               │       ├── InstanceProvider.java
│           │               │       ├── MethodsProvider.java
│           │               │       └── NoOpMethodAccessValidatorTest.java
│           │               ├── extension/
│           │               │   ├── ArrayToStringFilter.java
│           │               │   ├── ExtensionCustomizerTest.java
│           │               │   ├── InvocationCountingFunction.java
│           │               │   ├── ListToStringFilter.java
│           │               │   ├── MapToStringFilter.java
│           │               │   ├── TestingExtension.java
│           │               │   ├── core/
│           │               │   │   └── FormatFilterTest.java
│           │               │   └── escaper/
│           │               │       └── RawFilterTest.java
│           │               ├── lexer/
│           │               │   ├── IdentifierTest.java
│           │               │   ├── LexerImplTest.java
│           │               │   └── SyntaxTest.java
│           │               ├── macro/
│           │               │   ├── MacroGlobalVariablesTest.java
│           │               │   ├── PebbleExtension.java
│           │               │   ├── TestFilter.java
│           │               │   └── TestMacroCalls.java
│           │               ├── node/
│           │               │   ├── ForNodeTest.java
│           │               │   ├── IfNodeTest.java
│           │               │   └── expression/
│           │               │       ├── AndExpressionTest.java
│           │               │       ├── ExpressionTest.java
│           │               │       ├── OrExpressionTest.java
│           │               │       ├── StringExpressionParserTest.java
│           │               │       └── UnaryNotExpressionTest.java
│           │               ├── template/
│           │               │   └── tests/
│           │               │       ├── PebbleTestContext.java
│           │               │       ├── WhiteSpaceControlWithNewLineTrimmingTests.java
│           │               │       └── input/
│           │               │           ├── PebbleTestItem.java
│           │               │           └── PebbleTestItemType.java
│           │               └── utils/
│           │                   ├── LimitedSizeWriterTest.java
│           │                   ├── OperatorUtilsToNumberTest.java
│           │                   └── PathUtilsTest.java
│           └── resources/
│               ├── logback-test.xml
│               ├── security/
│               │   ├── allowedMethods.properties
│               │   └── unsafeMethods.properties
│               ├── template-tests/
│               │   ├── DoubleNestedIfStatement.peb
│               │   ├── DoubleNestedIfStatement.txt
│               │   ├── ForLoopWithNestedIfStatementAndMacro.peb
│               │   ├── ForLoopWithNestedIfStatementAndMacro.txt
│               │   ├── NestedIfStatementWithOneElseIfStatements.peb
│               │   ├── NestedIfStatementWithOneElseIfStatements.txt
│               │   ├── NestedIfStatementWithThreeElseIfStatements.peb
│               │   ├── NestedIfStatementWithThreeElseIfStatements.txt
│               │   ├── NestedIfStatementWithTwoElseIfStatements.peb
│               │   └── NestedIfStatementWithTwoElseIfStatements.txt
│               ├── templates/
│               │   ├── cache/
│               │   │   ├── cache1/
│               │   │   │   └── template.cache.peb
│               │   │   ├── cache2/
│               │   │   │   └── template.cache.peb
│               │   │   ├── template.cacheChild.peb
│               │   │   └── template.cacheParent.peb
│               │   ├── embed/
│               │   │   ├── cache/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template1.peb
│               │   │   │   └── template2.peb
│               │   │   ├── notes.md
│               │   │   ├── test0/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test1/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test10/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test11/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test12/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test13/
│               │   │   │   ├── template.embedbase.1.peb
│               │   │   │   ├── template.embedbase.2.peb
│               │   │   │   ├── template.embedbase.3.peb
│               │   │   │   ├── template.extendsbase.1.peb
│               │   │   │   ├── template.extendsbase.2.peb
│               │   │   │   ├── template.extendsbase.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test14/
│               │   │   │   ├── template.embedbase.1.peb
│               │   │   │   ├── template.extendsbase.1.peb
│               │   │   │   ├── template.extendsbase.2.peb
│               │   │   │   ├── template.extendsbase.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test15/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test16/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test17/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test18/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.error.txt
│               │   │   │   └── template.peb
│               │   │   ├── test2/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   └── template.result.txt
│               │   │   ├── test3/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   └── template.result.txt
│               │   │   ├── test4/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test5/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test6/
│               │   │   │   ├── template.base.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test7/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   ├── test8/
│               │   │   │   ├── template.base.1.peb
│               │   │   │   ├── template.base.2.peb
│               │   │   │   ├── template.base.3.peb
│               │   │   │   ├── template.peb
│               │   │   │   ├── template.result.twig.txt
│               │   │   │   └── template.result.txt
│               │   │   └── test9/
│               │   │       ├── template.base.1.peb
│               │   │       ├── template.base.2.peb
│               │   │       ├── template.base.3.peb
│               │   │       ├── template.peb
│               │   │       ├── template.result.twig.txt
│               │   │       └── template.result.txt
│               │   ├── function/
│               │   │   ├── template.block.peb
│               │   │   ├── template.child.peb
│               │   │   ├── template.childThenParentThenMacro.peb
│               │   │   ├── template.childWithContext.peb
│               │   │   ├── template.parent.peb
│               │   │   ├── template.parentAccessContext.peb
│               │   │   ├── template.parentThenMacro.peb
│               │   │   └── template.subchild.peb
│               │   ├── loader/
│               │   │   └── template.loaderTest.peb
│               │   ├── macros/
│               │   │   ├── from.peb
│               │   │   ├── import.as.peb
│               │   │   ├── include.peb
│               │   │   ├── index.peb
│               │   │   ├── invalid.from.peb
│               │   │   ├── invalid.from.sameAlias.peb
│               │   │   ├── invalid.from.unknownMacro.peb
│               │   │   ├── invalid.import.as.sameAlias.peb
│               │   │   ├── invalid.macro.peb
│               │   │   ├── macro.peb
│               │   │   ├── setVariableBase.peb
│               │   │   └── setVariableMacro.peb
│               │   ├── relativepath/
│               │   │   ├── subdirectory1/
│               │   │   │   ├── template.backwardslashes.peb
│               │   │   │   └── template.forwardslashes.peb
│               │   │   ├── subdirectory2/
│               │   │   │   └── template.relativeinclude2.peb
│               │   │   ├── template.relativeextends1.peb
│               │   │   ├── template.relativeextends2.peb
│               │   │   ├── template.relativeimport1.peb
│               │   │   ├── template.relativeimport2.peb
│               │   │   ├── template.relativeinclude1.peb
│               │   │   └── template.relativeinclude2.peb
│               │   ├── single-block/
│               │   │   ├── template.renderextendedblock1.peb
│               │   │   └── template.renderextendedblock2.peb
│               │   ├── template.autoescapeInclude1.peb
│               │   ├── template.autoescapeInclude2.peb
│               │   ├── template.autoescapeParent1.peb
│               │   ├── template.autoescapeParent2.peb
│               │   ├── template.child.peb
│               │   ├── template.concurrent1.peb
│               │   ├── template.concurrent2.peb
│               │   ├── template.dynamicChild.peb
│               │   ├── template.dynamicParent1.peb
│               │   ├── template.dynamicParent2.peb
│               │   ├── template.errorReporting.peb
│               │   ├── template.escapeCharactersInText.peb
│               │   ├── template.general.peb
│               │   ├── template.grandfather.peb
│               │   ├── template.import.dynamic.macro_ajax.peb
│               │   ├── template.import.dynamic.macro_classic.peb
│               │   ├── template.import.dynamic.peb
│               │   ├── template.importWithinBlock.peb
│               │   ├── template.include.dynamic.adminFooter.peb
│               │   ├── template.include.dynamic.defaultFooter.peb
│               │   ├── template.include.dynamic.peb
│               │   ├── template.include1.peb
│               │   ├── template.include2.peb
│               │   ├── template.includeInheritance1.peb
│               │   ├── template.includeInheritance2.peb
│               │   ├── template.includeInheritance3.peb
│               │   ├── template.includeOverrideBlock.peb
│               │   ├── template.includeOverrideBlock2.peb
│               │   ├── template.includeOverrideVariable1.peb
│               │   ├── template.includeOverrideVariable2.peb
│               │   ├── template.includePropagatesContext.peb
│               │   ├── template.includePropagatesContext2.peb
│               │   ├── template.includeWithParameter1.peb
│               │   ├── template.includeWithParameter2.peb
│               │   ├── template.includeWithParameterNotIsolated1.peb
│               │   ├── template.includeWithParameterNotIsolated2.peb
│               │   ├── template.includeWithParameterObject1.peb
│               │   ├── template.includeWithParameterObject2.peb
│               │   ├── template.includeWithinBlock.peb
│               │   ├── template.loaderTest.peb
│               │   ├── template.loaderTest.peb.suffix
│               │   ├── template.macro.child.peb
│               │   ├── template.macro.exploding.peb
│               │   ├── template.macro.parent.peb
│               │   ├── template.macro1.peb
│               │   ├── template.macro2.peb
│               │   ├── template.macro3.peb
│               │   ├── template.macroDouble.peb
│               │   ├── template.parallelInclude1.peb
│               │   ├── template.parallelInclude2.peb
│               │   ├── template.parallelParsing1.peb
│               │   ├── template.parallelParsing2.peb
│               │   ├── template.parallelWithImport.peb
│               │   ├── template.parallelWithImport2.peb
│               │   ├── template.parent.peb
│               │   ├── template.parent2.peb
│               │   ├── template.set.child.peb
│               │   ├── template.set.parent.peb
│               │   ├── template.skipGenerationBlock1.peb
│               │   ├── template.skipGenerationBlock2.peb
│               │   ├── template.skipGenerationBlock3.peb
│               │   ├── template.skipGenerationMacro1.peb
│               │   ├── template.skipGenerationMacro2.peb
│               │   ├── template.skipGenerationMacro3.peb
│               │   ├── template.strictModeComplexExpression.peb
│               │   └── template.strictModeSimpleExpression.peb
│               ├── testMessages.properties
│               └── testMessages_es_US.properties
├── pebble-spring/
│   ├── pebble-legacy-spring-boot-starter/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── io/
│   │       │   │       └── pebbletemplates/
│   │       │   │           └── boot/
│   │       │   │               └── autoconfigure/
│   │       │   │                   ├── AbstractPebbleConfiguration.java
│   │       │   │                   ├── PebbleAutoConfiguration.java
│   │       │   │                   ├── PebbleProperties.java
│   │       │   │                   ├── PebbleReactiveWebConfiguration.java
│   │       │   │                   ├── PebbleServletWebConfiguration.java
│   │       │   │                   ├── PebbleTemplateAvailabilityProvider.java
│   │       │   │                   └── package-info.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           ├── spring/
│   │       │           │   ├── aot.factories
│   │       │           │   └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │           └── spring.factories
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── boot/
│   │           │               ├── AppConfig.java
│   │           │               ├── Application.java
│   │           │               ├── Controllers.java
│   │           │               ├── Foo.java
│   │           │               └── autoconfigure/
│   │           │                   ├── NonWebAppTests.java
│   │           │                   ├── PebbleAutoConfigurationTest.java
│   │           │                   ├── ReactiveAppTest.java
│   │           │                   └── ServletAppTest.java
│   │           └── resources/
│   │               ├── messages.properties
│   │               ├── messages_es.properties
│   │               └── templates/
│   │                   ├── beans.peb
│   │                   ├── contextPath.peb
│   │                   ├── extensions.peb
│   │                   ├── hello.peb
│   │                   ├── index.peb
│   │                   ├── native-image.peb
│   │                   ├── responseObject.peb
│   │                   └── session.peb
│   ├── pebble-spring-boot-starter/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── io/
│   │       │   │       └── pebbletemplates/
│   │       │   │           └── boot/
│   │       │   │               └── autoconfigure/
│   │       │   │                   ├── AbstractPebbleConfiguration.java
│   │       │   │                   ├── PebbleAutoConfiguration.java
│   │       │   │                   ├── PebbleProperties.java
│   │       │   │                   ├── PebbleReactiveWebConfiguration.java
│   │       │   │                   ├── PebbleServletWebConfiguration.java
│   │       │   │                   ├── PebbleTemplateAvailabilityProvider.java
│   │       │   │                   └── package-info.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           ├── spring/
│   │       │           │   ├── aot.factories
│   │       │           │   ├── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │           │   ├── org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebFlux.imports
│   │       │           │   └── org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureWebMvc.imports
│   │       │           └── spring.factories
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── boot/
│   │           │               ├── AppConfig.java
│   │           │               ├── Application.java
│   │           │               ├── Controllers.java
│   │           │               ├── Foo.java
│   │           │               └── autoconfigure/
│   │           │                   ├── NonWebAppTests.java
│   │           │                   ├── PebbleAutoConfigurationTest.java
│   │           │                   ├── ReactiveAppTest.java
│   │           │                   └── ServletAppTest.java
│   │           └── resources/
│   │               ├── messages.properties
│   │               ├── messages_es.properties
│   │               └── templates/
│   │                   ├── beans.peb
│   │                   ├── contextPath.peb
│   │                   ├── extensions.peb
│   │                   ├── hello.peb
│   │                   ├── index.peb
│   │                   ├── native-image.peb
│   │                   ├── responseObject.peb
│   │                   └── session.peb
│   ├── pebble-spring6/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── io/
│   │       │           └── pebbletemplates/
│   │       │               └── spring/
│   │       │                   ├── context/
│   │       │                   │   └── Beans.java
│   │       │                   ├── extension/
│   │       │                   │   ├── SpringExtension.java
│   │       │                   │   └── function/
│   │       │                   │       ├── HrefFunction.java
│   │       │                   │       ├── MessageSourceFunction.java
│   │       │                   │       └── bindingresult/
│   │       │                   │           ├── BaseBindingResultFunction.java
│   │       │                   │           ├── GetAllErrorsFunction.java
│   │       │                   │           ├── GetFieldErrorsFunction.java
│   │       │                   │           ├── GetGlobalErrorsFunction.java
│   │       │                   │           ├── HasErrorsFunction.java
│   │       │                   │           ├── HasFieldErrorsFunction.java
│   │       │                   │           └── HasGlobalErrorsFunction.java
│   │       │                   ├── reactive/
│   │       │                   │   ├── PebbleReactiveView.java
│   │       │                   │   └── PebbleReactiveViewResolver.java
│   │       │                   └── servlet/
│   │       │                       ├── PebbleView.java
│   │       │                       └── PebbleViewResolver.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── spring/
│   │           │               ├── PebbleViewResolverTest.java
│   │           │               ├── bean/
│   │           │               │   └── SomeBean.java
│   │           │               └── config/
│   │           │                   └── MVCConfig.java
│   │           └── resources/
│   │               └── io/
│   │                   └── pebbletemplates/
│   │                       └── spring/
│   │                           ├── expectedResponse/
│   │                           │   ├── beansTest.html
│   │                           │   ├── bindingResultTest.html
│   │                           │   ├── bindingResultWithMacroTest.html
│   │                           │   ├── hrefFunctionTest.html
│   │                           │   ├── messageEnTest.html
│   │                           │   ├── messageFrTest.html
│   │                           │   ├── requestTest.html
│   │                           │   ├── responseTest.html
│   │                           │   └── sessionTest.html
│   │                           ├── messages_en.properties
│   │                           ├── messages_fr.properties
│   │                           └── template/
│   │                               ├── beansTest.html
│   │                               ├── bindingResultTest.html
│   │                               ├── bindingResultWithMacroTest.html
│   │                               ├── hrefFunctionTest.html
│   │                               ├── messageEnTest.html
│   │                               ├── messageFrTest.html
│   │                               ├── requestTest.html
│   │                               ├── responseTest.html
│   │                               └── sessionTest.html
│   ├── pebble-spring7/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── io/
│   │       │           └── pebbletemplates/
│   │       │               └── spring/
│   │       │                   ├── context/
│   │       │                   │   └── Beans.java
│   │       │                   ├── extension/
│   │       │                   │   ├── SpringExtension.java
│   │       │                   │   └── function/
│   │       │                   │       ├── HrefFunction.java
│   │       │                   │       ├── MessageSourceFunction.java
│   │       │                   │       └── bindingresult/
│   │       │                   │           ├── BaseBindingResultFunction.java
│   │       │                   │           ├── GetAllErrorsFunction.java
│   │       │                   │           ├── GetFieldErrorsFunction.java
│   │       │                   │           ├── GetGlobalErrorsFunction.java
│   │       │                   │           ├── HasErrorsFunction.java
│   │       │                   │           ├── HasFieldErrorsFunction.java
│   │       │                   │           └── HasGlobalErrorsFunction.java
│   │       │                   ├── reactive/
│   │       │                   │   ├── PebbleReactiveView.java
│   │       │                   │   └── PebbleReactiveViewResolver.java
│   │       │                   └── servlet/
│   │       │                       ├── PebbleView.java
│   │       │                       └── PebbleViewResolver.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── io/
│   │           │       └── pebbletemplates/
│   │           │           └── spring/
│   │           │               ├── PebbleViewResolverTest.java
│   │           │               ├── bean/
│   │           │               │   └── SomeBean.java
│   │           │               └── config/
│   │           │                   └── MVCConfig.java
│   │           └── resources/
│   │               └── io/
│   │                   └── pebbletemplates/
│   │                       └── spring/
│   │                           ├── expectedResponse/
│   │                           │   ├── beansTest.html
│   │                           │   ├── bindingResultTest.html
│   │                           │   ├── bindingResultWithMacroTest.html
│   │                           │   ├── hrefFunctionTest.html
│   │                           │   ├── messageEnTest.html
│   │                           │   ├── messageFrTest.html
│   │                           │   ├── requestTest.html
│   │                           │   ├── responseTest.html
│   │                           │   └── sessionTest.html
│   │                           ├── messages_en.properties
│   │                           ├── messages_fr.properties
│   │                           └── template/
│   │                               ├── beansTest.html
│   │                               ├── bindingResultTest.html
│   │                               ├── bindingResultWithMacroTest.html
│   │                               ├── hrefFunctionTest.html
│   │                               ├── messageEnTest.html
│   │                               ├── messageFrTest.html
│   │                               ├── requestTest.html
│   │                               ├── responseTest.html
│   │                               └── sessionTest.html
│   └── pom.xml
└── pom.xml
Download .txt
Showing preview only (239K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2946 symbols across 377 files)

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/AbstractPebbleConfiguration.java
  class AbstractPebbleConfiguration (line 3) | abstract class AbstractPebbleConfiguration {
    method stripLeadingSlash (line 5) | protected String stripLeadingSlash(String value) {

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleAutoConfiguration.java
  class PebbleAutoConfiguration (line 26) | @AutoConfiguration
    method pebbleLoader (line 32) | @Bean
    method springExtension (line 43) | @Bean
    method pebbleEngine (line 49) | @Bean
  class PebbleTemplatesHints (line 77) | class PebbleTemplatesHints implements RuntimeHintsRegistrar {
    method registerHints (line 79) | @Override

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleProperties.java
  class PebbleProperties (line 7) | @ConfigurationProperties("pebble")
    method PebbleProperties (line 17) | public PebbleProperties() {
    method getDefaultLocale (line 22) | public Locale getDefaultLocale() {
    method setDefaultLocale (line 26) | public void setDefaultLocale(Locale defaultLocale) {
    method isStrictVariables (line 30) | public boolean isStrictVariables() {
    method setStrictVariables (line 34) | public void setStrictVariables(boolean strictVariables) {
    method isGreedyMatchMethod (line 38) | public boolean isGreedyMatchMethod() {
    method setGreedyMatchMethod (line 42) | public void setGreedyMatchMethod(boolean greedyMatchMethod) {

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleReactiveWebConfiguration.java
  class PebbleReactiveWebConfiguration (line 12) | @Configuration(proxyBeanMethods = false)
    method pebbleReactiveViewResolver (line 16) | @Bean

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleServletWebConfiguration.java
  class PebbleServletWebConfiguration (line 12) | @Configuration(proxyBeanMethods = false)
    method pebbleViewResolver (line 16) | @Bean

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleTemplateAvailabilityProvider.java
  class PebbleTemplateAvailabilityProvider (line 11) | public class PebbleTemplateAvailabilityProvider implements TemplateAvail...
    method isTemplateAvailable (line 13) | @Override

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/AppConfig.java
  class AppConfig (line 21) | @Configuration(proxyBeanMethods = false)
    method messageSource (line 23) | @Bean
    method localeResolver (line 31) | @Bean
    method testExtension (line 36) | @Bean
    class TestExtension (line 41) | public static class TestExtension extends AbstractExtension {
      method getFunctions (line 43) | @Override
      class TestFunction (line 50) | public static class TestFunction implements Function {
        method getArgumentNames (line 52) | @Override
        method execute (line 57) | @Override

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/Controllers.java
  class Controllers (line 7) | @Controller
    method hello (line 10) | @RequestMapping("/hello.action")
    method index (line 15) | @RequestMapping("/index.action")
    method contextPath (line 20) | @RequestMapping("/contextPath.action")
    method extensions (line 25) | @RequestMapping("/extensions.action")
    method beans (line 30) | @RequestMapping("/beans.action")
    method session (line 35) | @RequestMapping("/session.action")
    method response (line 41) | @RequestMapping("/response.action")

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/Foo.java
  class Foo (line 5) | @Component

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/NonWebAppTests.java
  class NonWebAppTests (line 13) | @SpringBootTest(classes = Application.class,
    method testOk (line 20) | @Test

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/PebbleAutoConfigurationTest.java
  class PebbleAutoConfigurationTest (line 30) | class PebbleAutoConfigurationTest {
    method registerBeansForServletApp (line 38) | @Test
    method registerCustomBeansForServletApp (line 51) | @Test
    method registerCompilerForServletApp (line 59) | @Test
    method registerCustomMethodAccessValidatorForServletApp (line 73) | @Test
    method registerBeansForReactiveApp (line 87) | @Test
    method registerCustomBeansForReactiveApp (line 102) | @Test
    method registerCompilerForReactiveApp (line 110) | @Test
    method registerCustomMethodAccessValidatorForReactiveApp (line 124) | @Test
    method loadWithServlet (line 139) | private void loadWithServlet(Class<?> config) {
    method loadWithReactive (line 152) | private void loadWithReactive(Class<?> config) {
    class BaseConfiguration (line 165) | @Configuration(proxyBeanMethods = false)
    class CustomPebbleEngineCompilerConfiguration (line 171) | @Configuration(proxyBeanMethods = false)
      method pebbleEngine (line 174) | @Bean
      method customSpringExtension (line 179) | @Bean
    class CustomPebbleViewResolverConfiguration (line 186) | @Configuration(proxyBeanMethods = false)
      method pebbleViewResolver (line 188) | @Bean
    class CustomPebbleReactiveViewResolverConfiguration (line 195) | @Configuration(proxyBeanMethods = false)
      method pebbleReactiveViewResolver (line 198) | @Bean
    class CustomPebbleViewResolver (line 205) | protected static class CustomPebbleViewResolver extends AbstractTempla...
      method CustomPebbleViewResolver (line 207) | public CustomPebbleViewResolver() {
    class CustomPebbleReactiveViewResolver (line 213) | protected static class CustomPebbleReactiveViewResolver extends UrlBas...
      method CustomPebbleReactiveViewResolver (line 215) | public CustomPebbleReactiveViewResolver() {
    class CustomMethodAccessValidatorConfiguration (line 221) | @Configuration(proxyBeanMethods = false)
      method methodAccessValidator (line 224) | @Bean

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/ReactiveAppTest.java
  class ReactiveAppTest (line 12) | @SpringBootTest(classes = Application.class,
    method testOk (line 20) | @Test
    method testRequestAccess (line 31) | @Test
    method testEnglishHello (line 42) | @Test
    method testSpanishHello (line 54) | @Test
    method testAdditionalExtensions (line 66) | @Test
    method testBeansAccess (line 78) | @Test
    method testResponseAccess (line 89) | @Test
    method testSessionAccess (line 100) | @Test

FILE: pebble-spring/pebble-legacy-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/ServletAppTest.java
  class ServletAppTest (line 22) | @SpringBootTest(classes = Application.class, webEnvironment = WebEnviron...
    method setup (line 30) | @BeforeEach
    method testOk (line 35) | @Test
    method testRequestAccess (line 42) | @Test
    method testEnglishHello (line 50) | @Test
    method testSpanishHello (line 58) | @Test
    method testAdditionalExtensions (line 66) | @Test
    method testBeansAccess (line 74) | @Test
    method testResponseAccess (line 82) | @Test

FILE: pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/AbstractPebbleConfiguration.java
  class AbstractPebbleConfiguration (line 3) | abstract class AbstractPebbleConfiguration {
    method stripLeadingSlash (line 5) | protected String stripLeadingSlash(String value) {

FILE: pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleAutoConfiguration.java
  class PebbleAutoConfiguration (line 26) | @AutoConfiguration
    method pebbleLoader (line 32) | @Bean
    method springExtension (line 43) | @Bean
    method pebbleEngine (line 49) | @Bean
  class PebbleTemplatesHints (line 75) | class PebbleTemplatesHints implements RuntimeHintsRegistrar {
    method registerHints (line 77) | @Override

FILE: pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleProperties.java
  class PebbleProperties (line 16) | @ConfigurationProperties("pebble")
    method getServlet (line 62) | public Servlet getServlet() {
    method getReactive (line 66) | public Reactive getReactive() {
    method getPrefix (line 70) | public String getPrefix() {
    method setPrefix (line 74) | public void setPrefix(String prefix) {
    method getSuffix (line 78) | public String getSuffix() {
    method setSuffix (line 82) | public void setSuffix(String suffix) {
    method getViewNames (line 86) | public String @Nullable [] getViewNames() {
    method setViewNames (line 90) | public void setViewNames(String @Nullable [] viewNames) {
    method getRequestContextAttribute (line 94) | public @Nullable String getRequestContextAttribute() {
    method setRequestContextAttribute (line 98) | public void setRequestContextAttribute(@Nullable String requestContext...
    method getCharset (line 102) | public Charset getCharset() {
    method getCharsetName (line 106) | public String getCharsetName() {
    method setCharset (line 110) | public void setCharset(Charset charset) {
    method isCheckTemplateLocation (line 114) | public boolean isCheckTemplateLocation() {
    method setCheckTemplateLocation (line 118) | public void setCheckTemplateLocation(boolean checkTemplateLocation) {
    class Servlet (line 122) | public static class Servlet {
      method Servlet (line 166) | public Servlet() {
      method Servlet (line 170) | private Servlet(Supplier<@Nullable Charset> charset) {
      method isAllowRequestOverride (line 174) | public boolean isAllowRequestOverride() {
      method setAllowRequestOverride (line 178) | public void setAllowRequestOverride(boolean allowRequestOverride) {
      method isAllowSessionOverride (line 182) | public boolean isAllowSessionOverride() {
      method setAllowSessionOverride (line 186) | public void setAllowSessionOverride(boolean allowSessionOverride) {
      method isCache (line 190) | public boolean isCache() {
      method setCache (line 194) | public void setCache(boolean cache) {
      method getContentType (line 198) | public MimeType getContentType() {
      method setContentType (line 211) | public void setContentType(MimeType contentType) {
      method isExposeRequestAttributes (line 215) | public boolean isExposeRequestAttributes() {
      method setExposeRequestAttributes (line 219) | public void setExposeRequestAttributes(boolean exposeRequestAttribut...
      method isExposeSessionAttributes (line 223) | public boolean isExposeSessionAttributes() {
      method setExposeSessionAttributes (line 227) | public void setExposeSessionAttributes(boolean exposeSessionAttribut...
      method isExposeSpringMacroHelpers (line 231) | public boolean isExposeSpringMacroHelpers() {
      method setExposeSpringMacroHelpers (line 235) | public void setExposeSpringMacroHelpers(boolean exposeSpringMacroHel...
    class Reactive (line 241) | public static class Reactive {
      method getMediaTypes (line 248) | public @Nullable List<MediaType> getMediaTypes() {
      method setMediaTypes (line 252) | public void setMediaTypes(@Nullable List<MediaType> mediaTypes) {
    method getDefaultLocale (line 258) | public Locale getDefaultLocale() {
    method setDefaultLocale (line 262) | public void setDefaultLocale(Locale defaultLocale) {
    method isStrictVariables (line 266) | public boolean isStrictVariables() {
    method setStrictVariables (line 270) | public void setStrictVariables(boolean strictVariables) {
    method isGreedyMatchMethod (line 274) | public boolean isGreedyMatchMethod() {
    method setGreedyMatchMethod (line 278) | public void setGreedyMatchMethod(boolean greedyMatchMethod) {

FILE: pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleReactiveWebConfiguration.java
  class PebbleReactiveWebConfiguration (line 14) | @Configuration(proxyBeanMethods = false)
    method pebbleReactiveViewResolver (line 18) | @Bean

FILE: pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleServletWebConfiguration.java
  class PebbleServletWebConfiguration (line 13) | @Configuration(proxyBeanMethods = false)
    method pebbleViewResolver (line 17) | @Bean

FILE: pebble-spring/pebble-spring-boot-starter/src/main/java/io/pebbletemplates/boot/autoconfigure/PebbleTemplateAvailabilityProvider.java
  class PebbleTemplateAvailabilityProvider (line 11) | public class PebbleTemplateAvailabilityProvider implements TemplateAvail...
    method isTemplateAvailable (line 13) | @Override

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/AppConfig.java
  class AppConfig (line 21) | @Configuration(proxyBeanMethods = false)
    method messageSource (line 23) | @Bean
    method localeResolver (line 31) | @Bean
    method testExtension (line 36) | @Bean
    class TestExtension (line 41) | public static class TestExtension extends AbstractExtension {
      method getFunctions (line 43) | @Override
      class TestFunction (line 50) | public static class TestFunction implements Function {
        method getArgumentNames (line 52) | @Override
        method execute (line 57) | @Override

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/Controllers.java
  class Controllers (line 7) | @Controller
    method hello (line 10) | @RequestMapping("/hello.action")
    method index (line 15) | @RequestMapping("/index.action")
    method contextPath (line 20) | @RequestMapping("/contextPath.action")
    method extensions (line 25) | @RequestMapping("/extensions.action")
    method beans (line 30) | @RequestMapping("/beans.action")
    method session (line 35) | @RequestMapping("/session.action")
    method response (line 41) | @RequestMapping("/response.action")

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/Foo.java
  class Foo (line 5) | @Component

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/NonWebAppTests.java
  class NonWebAppTests (line 13) | @SpringBootTest(classes = Application.class,
    method testOk (line 20) | @Test

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/PebbleAutoConfigurationTest.java
  class PebbleAutoConfigurationTest (line 32) | class PebbleAutoConfigurationTest {
    method registerBeansForServletApp (line 39) | @Test
    method registerCustomBeansForServletApp (line 54) | @Test
    method registerCompilerForServletApp (line 62) | @Test
    method registerCustomMethodAccessValidatorForServletApp (line 81) | @Test
    method registerBeansForReactiveApp (line 100) | @Test
    method registerCustomBeansForReactiveApp (line 119) | @Test
    method registerCompilerForReactiveApp (line 127) | @Test
    method registerCustomMethodAccessValidatorForReactiveApp (line 145) | @Test
    method loadWithServlet (line 164) | private void loadWithServlet(Class<?> config) {
    method loadWithReactive (line 178) | private void loadWithReactive(Class<?> config) {
    class BaseConfiguration (line 191) | @Configuration(proxyBeanMethods = false)
    class CustomPebbleEngineCompilerConfiguration (line 197) | @Configuration(proxyBeanMethods = false)
      method pebbleEngine (line 200) | @Bean
      method customSpringExtension (line 205) | @Bean
    class CustomPebbleViewResolverConfiguration (line 212) | @Configuration(proxyBeanMethods = false)
      method pebbleViewResolver (line 215) | @Bean
    class CustomPebbleReactiveViewResolverConfiguration (line 222) | @Configuration(proxyBeanMethods = false)
      method pebbleReactiveViewResolver (line 225) | @Bean
    class CustomPebbleViewResolver (line 232) | protected static class CustomPebbleViewResolver extends AbstractTempla...
      method CustomPebbleViewResolver (line 234) | public CustomPebbleViewResolver() {
    class CustomPebbleReactiveViewResolver (line 240) | protected static class CustomPebbleReactiveViewResolver extends UrlBas...
      method CustomPebbleReactiveViewResolver (line 242) | public CustomPebbleReactiveViewResolver() {
    class CustomMethodAccessValidatorConfiguration (line 248) | @Configuration(proxyBeanMethods = false)
      method methodAccessValidator (line 251) | @Bean

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/ReactiveAppTest.java
  class ReactiveAppTest (line 13) | @SpringBootTest(classes = Application.class,
    method testOk (line 22) | @Test
    method testRequestAccess (line 33) | @Test
    method testEnglishHello (line 44) | @Test
    method testSpanishHello (line 56) | @Test
    method testAdditionalExtensions (line 68) | @Test
    method testBeansAccess (line 80) | @Test
    method testResponseAccess (line 91) | @Test
    method testSessionAccess (line 102) | @Test

FILE: pebble-spring/pebble-spring-boot-starter/src/test/java/io/pebbletemplates/boot/autoconfigure/ServletAppTest.java
  class ServletAppTest (line 22) | @SpringBootTest(classes = Application.class, webEnvironment = WebEnviron...
    method setup (line 30) | @BeforeEach
    method testOk (line 35) | @Test
    method testRequestAccess (line 42) | @Test
    method testEnglishHello (line 50) | @Test
    method testSpanishHello (line 58) | @Test
    method testAdditionalExtensions (line 66) | @Test
    method testBeansAccess (line 74) | @Test
    method testResponseAccess (line 82) | @Test

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/context/Beans.java
  class Beans (line 25) | public class Beans implements Map<String, Object> {
    method Beans (line 29) | public Beans(ApplicationContext ctx) {
    method clear (line 34) | @Override
    method containsKey (line 39) | @Override
    method containsValue (line 45) | @Override
    method entrySet (line 51) | @Override
    method get (line 56) | @Override
    method isEmpty (line 62) | @Override
    method keySet (line 67) | @Override
    method put (line 72) | @Override
    method putAll (line 77) | @Override
    method remove (line 82) | @Override
    method size (line 87) | @Override
    method values (line 92) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/SpringExtension.java
  class SpringExtension (line 31) | public class SpringExtension extends AbstractExtension {
    method SpringExtension (line 35) | public SpringExtension(MessageSource messageSource) {
    method getFunctions (line 39) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/HrefFunction.java
  class HrefFunction (line 21) | public class HrefFunction implements Function {
    method HrefFunction (line 33) | public HrefFunction() {
    method execute (line 43) | @Override
    method addUrlParameter (line 54) | private void addUrlParameter(Map<String, Object> args, StringBuffer re...
    method getContextPath (line 61) | private String getContextPath() {
    method getRequest (line 68) | private HttpServletRequest getRequest() {
    method getArgumentNames (line 78) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/MessageSourceFunction.java
  class MessageSourceFunction (line 26) | public class MessageSourceFunction implements Function {
    method MessageSourceFunction (line 32) | public MessageSourceFunction(MessageSource messageSource) {
    method execute (line 36) | @Override
    method extractKey (line 46) | private String extractKey(Map<String, Object> args) {
    method extractArguments (line 50) | private List<Object> extractArguments(Map<String, Object> args) {
    method getArgumentNames (line 61) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/BaseBindingResultFunction.java
  class BaseBindingResultFunction (line 24) | public abstract class BaseBindingResultFunction implements Function {
    method BaseBindingResultFunction (line 31) | protected BaseBindingResultFunction(String... argumentsName) {
    method getArgumentNames (line 35) | @Override
    method getBindingResult (line 40) | protected BindingResult getBindingResult(String formName, EvaluationCo...

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/GetAllErrorsFunction.java
  class GetAllErrorsFunction (line 27) | public class GetAllErrorsFunction extends BaseBindingResultFunction {
    method GetAllErrorsFunction (line 33) | public GetAllErrorsFunction(MessageSource messageSource) {
    method execute (line 38) | @Override
    method constructErrorMessage (line 49) | private List<String> constructErrorMessage(Locale locale, BindingResul...

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/GetFieldErrorsFunction.java
  class GetFieldErrorsFunction (line 27) | public class GetFieldErrorsFunction extends BaseBindingResultFunction {
    method GetFieldErrorsFunction (line 33) | public GetFieldErrorsFunction(MessageSource messageSource) {
    method execute (line 38) | @Override
    method constructErrorMessages (line 54) | private List<String> constructErrorMessages(String field, Locale locale,

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/GetGlobalErrorsFunction.java
  class GetGlobalErrorsFunction (line 27) | public class GetGlobalErrorsFunction extends BaseBindingResultFunction {
    method GetGlobalErrorsFunction (line 33) | public GetGlobalErrorsFunction(MessageSource messageSource) {
    method execute (line 38) | @Override
    method constructErrorMessages (line 49) | private List<String> constructErrorMessages(Locale locale, BindingResu...

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/HasErrorsFunction.java
  class HasErrorsFunction (line 22) | public class HasErrorsFunction extends BaseBindingResultFunction {
    method HasErrorsFunction (line 26) | public HasErrorsFunction() {
    method execute (line 30) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/HasFieldErrorsFunction.java
  class HasFieldErrorsFunction (line 22) | public class HasFieldErrorsFunction extends BaseBindingResultFunction {
    method HasFieldErrorsFunction (line 26) | public HasFieldErrorsFunction() {
    method execute (line 30) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/HasGlobalErrorsFunction.java
  class HasGlobalErrorsFunction (line 22) | public class HasGlobalErrorsFunction extends BaseBindingResultFunction {
    method HasGlobalErrorsFunction (line 26) | public HasGlobalErrorsFunction() {
    method execute (line 30) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/reactive/PebbleReactiveView.java
  class PebbleReactiveView (line 29) | public class PebbleReactiveView extends AbstractUrlBasedView {
    method checkResourceExists (line 39) | @Override
    method renderInternal (line 44) | @Override
    method getModelAttributes (line 65) | @Override
    method addVariablesToModel (line 70) | private Map<String, ?> addVariablesToModel(Map<String, ?> model, Serve...
    method getCharset (line 79) | private Charset getCharset(@Nullable MediaType mediaType) {
    method evaluateTemplate (line 85) | private void evaluateTemplate(Map<String, Object> model, Locale locale...
    method getPebbleEngine (line 95) | public PebbleEngine getPebbleEngine() {
    method setPebbleEngine (line 99) | public void setPebbleEngine(PebbleEngine pebbleEngine) {
    method getTemplateName (line 103) | public String getTemplateName() {
    method setTemplateName (line 107) | public void setTemplateName(String templateName) {

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/reactive/PebbleReactiveViewResolver.java
  class PebbleReactiveViewResolver (line 7) | public class PebbleReactiveViewResolver extends UrlBasedViewResolver {
    method PebbleReactiveViewResolver (line 11) | public PebbleReactiveViewResolver(PebbleEngine pebbleEngine) {
    method createView (line 16) | @Override
    method requiredViewClass (line 25) | @Override

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/servlet/PebbleView.java
  class PebbleView (line 25) | public class PebbleView extends AbstractTemplateView {
    method renderMergedTemplateModel (line 52) | @Override
    method setCharacterEncoding (line 63) | private void setCharacterEncoding(HttpServletResponse response) {
    method addVariablesToModel (line 69) | private void addVariablesToModel(Map<String, Object> model, HttpServle...
    method evaluateTemplate (line 77) | private void evaluateTemplate(Map<String, Object> model, HttpServletRe...
    method logElapsedTime (line 90) | private void logElapsedTime(long startNanoTime, HttpServletRequest req...
    method setCharacterEncoding (line 103) | public void setCharacterEncoding(String characterEncoding) {
    method setPebbleEngine (line 107) | public void setPebbleEngine(PebbleEngine pebbleEngine) {
    method setTemplateName (line 111) | public void setTemplateName(String name) {

FILE: pebble-spring/pebble-spring6/src/main/java/io/pebbletemplates/spring/servlet/PebbleViewResolver.java
  class PebbleViewResolver (line 15) | public class PebbleViewResolver extends AbstractTemplateViewResolver imp...
    method PebbleViewResolver (line 20) | public PebbleViewResolver(PebbleEngine pebbleEngine) {
    method afterPropertiesSet (line 25) | @Override
    method setCharacterEncoding (line 32) | public void setCharacterEncoding(String characterEncoding) {
    method buildView (line 36) | @Override
    method requiredViewClass (line 46) | @Override

FILE: pebble-spring/pebble-spring6/src/test/java/io/pebbletemplates/spring/PebbleViewResolverTest.java
  class PebbleViewResolverTest (line 45) | @ExtendWith(SpringExtension.class)
    method initRequest (line 62) | @BeforeEach
    method initBindingResult (line 70) | @BeforeEach
    method initBindingResultAllErrors (line 77) | private void initBindingResultAllErrors() {
    method initBindingResultGlobalErrors (line 86) | private void initBindingResultGlobalErrors() {
    method initBindingResultFieldErrors (line 95) | private void initBindingResultFieldErrors() {
    method whenRenderingAPage_givenPageWithBeanVariable_thenRenderingIsOK (line 105) | @Test
    method whenRenderingAPage_givenPageWithBindingResult_thenRenderingIsOK (line 112) | @Test
    method givenBindingResult (line 121) | private Map<String, Object> givenBindingResult() {
    method whenRenderingAPage_givenPageWithBindingResultAndMacro_thenRenderingIsOK (line 127) | @Test
    method whenRenderingAPage_givenPageWithHrefFunction_thenRenderingIsOK (line 136) | @Test
    method whenRenderingAPageInEnglish_givenPageWithResourceBundleMessage_thenRenderingIsOK (line 143) | @Test
    method whenRenderingAPageInFrench_givenPageWithResourceBundleMessage_thenRenderingIsOK (line 151) | @Test
    method whenRenderingAPage_givenPageWithHttpRequestVariable_thenRenderingIsOK (line 161) | @Test
    method whenRenderingAPage_givenPageWithHttpResponseVariable_thenRenderingIsOK (line 169) | @Test
    method whenRenderingAPage_givenPageWithHttpSessionVariable_thenRenderingIsOK (line 177) | @Test
    method assertOutput (line 185) | private void assertOutput(String output, String expectedOutput) throws...
    method readExpectedOutputResource (line 189) | private String readExpectedOutputResource(String expectedOutput) throw...
    method removeAllWhitespaces (line 202) | private String removeAllWhitespaces(String source) {
    method render (line 206) | private String render(String location, Map<String, ?> model) throws Ex...

FILE: pebble-spring/pebble-spring6/src/test/java/io/pebbletemplates/spring/bean/SomeBean.java
  class SomeBean (line 14) | public class SomeBean {
    method foo (line 16) | public String foo() {

FILE: pebble-spring/pebble-spring6/src/test/java/io/pebbletemplates/spring/config/MVCConfig.java
  class MVCConfig (line 26) | @Configuration(proxyBeanMethods = false)
    method foo (line 29) | @Bean
    method messageSource (line 34) | @Bean
    method pebbleEngine (line 42) | @Bean
    method springExtension (line 52) | @Bean
    method templateLoader (line 57) | @Bean
    method viewResolver (line 62) | @Bean

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/context/Beans.java
  class Beans (line 25) | public class Beans implements Map<String, Object> {
    method Beans (line 29) | public Beans(ApplicationContext ctx) {
    method clear (line 34) | @Override
    method containsKey (line 39) | @Override
    method containsValue (line 45) | @Override
    method entrySet (line 51) | @Override
    method get (line 56) | @Override
    method isEmpty (line 62) | @Override
    method keySet (line 67) | @Override
    method put (line 72) | @Override
    method putAll (line 77) | @Override
    method remove (line 82) | @Override
    method size (line 87) | @Override
    method values (line 92) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/SpringExtension.java
  class SpringExtension (line 26) | public class SpringExtension extends AbstractExtension {
    method SpringExtension (line 30) | public SpringExtension(MessageSource messageSource) {
    method getFunctions (line 34) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/HrefFunction.java
  class HrefFunction (line 21) | public class HrefFunction implements Function {
    method HrefFunction (line 33) | public HrefFunction() {
    method execute (line 43) | @Override
    method addUrlParameter (line 54) | private void addUrlParameter(Map<String, Object> args, StringBuffer re...
    method getContextPath (line 61) | private String getContextPath() {
    method getRequest (line 68) | private HttpServletRequest getRequest() {
    method getArgumentNames (line 78) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/MessageSourceFunction.java
  class MessageSourceFunction (line 26) | public class MessageSourceFunction implements Function {
    method MessageSourceFunction (line 32) | public MessageSourceFunction(MessageSource messageSource) {
    method execute (line 36) | @Override
    method extractKey (line 46) | private String extractKey(Map<String, Object> args) {
    method extractArguments (line 50) | private List<Object> extractArguments(Map<String, Object> args) {
    method getArgumentNames (line 61) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/BaseBindingResultFunction.java
  class BaseBindingResultFunction (line 24) | public abstract class BaseBindingResultFunction implements Function {
    method BaseBindingResultFunction (line 31) | protected BaseBindingResultFunction(String... argumentsName) {
    method getArgumentNames (line 35) | @Override
    method getBindingResult (line 40) | protected BindingResult getBindingResult(String formName, EvaluationCo...

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/GetAllErrorsFunction.java
  class GetAllErrorsFunction (line 27) | public class GetAllErrorsFunction extends BaseBindingResultFunction {
    method GetAllErrorsFunction (line 33) | public GetAllErrorsFunction(MessageSource messageSource) {
    method execute (line 38) | @Override
    method constructErrorMessage (line 49) | private List<String> constructErrorMessage(Locale locale, BindingResul...

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/GetFieldErrorsFunction.java
  class GetFieldErrorsFunction (line 27) | public class GetFieldErrorsFunction extends BaseBindingResultFunction {
    method GetFieldErrorsFunction (line 33) | public GetFieldErrorsFunction(MessageSource messageSource) {
    method execute (line 38) | @Override
    method constructErrorMessages (line 54) | private List<String> constructErrorMessages(String field, Locale locale,

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/GetGlobalErrorsFunction.java
  class GetGlobalErrorsFunction (line 27) | public class GetGlobalErrorsFunction extends BaseBindingResultFunction {
    method GetGlobalErrorsFunction (line 33) | public GetGlobalErrorsFunction(MessageSource messageSource) {
    method execute (line 38) | @Override
    method constructErrorMessages (line 49) | private List<String> constructErrorMessages(Locale locale, BindingResu...

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/HasErrorsFunction.java
  class HasErrorsFunction (line 22) | public class HasErrorsFunction extends BaseBindingResultFunction {
    method HasErrorsFunction (line 26) | public HasErrorsFunction() {
    method execute (line 30) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/HasFieldErrorsFunction.java
  class HasFieldErrorsFunction (line 22) | public class HasFieldErrorsFunction extends BaseBindingResultFunction {
    method HasFieldErrorsFunction (line 26) | public HasFieldErrorsFunction() {
    method execute (line 30) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/extension/function/bindingresult/HasGlobalErrorsFunction.java
  class HasGlobalErrorsFunction (line 22) | public class HasGlobalErrorsFunction extends BaseBindingResultFunction {
    method HasGlobalErrorsFunction (line 26) | public HasGlobalErrorsFunction() {
    method execute (line 30) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/reactive/PebbleReactiveView.java
  class PebbleReactiveView (line 29) | public class PebbleReactiveView extends AbstractUrlBasedView {
    method checkResourceExists (line 39) | @Override
    method renderInternal (line 44) | @Override
    method getModelAttributes (line 65) | @Override
    method addVariablesToModel (line 70) | private Map<String, ?> addVariablesToModel(Map<String, ?> model, Serve...
    method getCharset (line 79) | private Charset getCharset(@Nullable MediaType mediaType) {
    method evaluateTemplate (line 85) | private void evaluateTemplate(Map<String, Object> model, Locale locale...
    method getPebbleEngine (line 95) | public PebbleEngine getPebbleEngine() {
    method setPebbleEngine (line 99) | public void setPebbleEngine(PebbleEngine pebbleEngine) {
    method getTemplateName (line 103) | public String getTemplateName() {
    method setTemplateName (line 107) | public void setTemplateName(String templateName) {

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/reactive/PebbleReactiveViewResolver.java
  class PebbleReactiveViewResolver (line 7) | public class PebbleReactiveViewResolver extends UrlBasedViewResolver {
    method PebbleReactiveViewResolver (line 11) | public PebbleReactiveViewResolver(PebbleEngine pebbleEngine) {
    method createView (line 16) | @Override
    method requiredViewClass (line 25) | @Override

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/servlet/PebbleView.java
  class PebbleView (line 25) | public class PebbleView extends AbstractTemplateView {
    method renderMergedTemplateModel (line 52) | @Override
    method setCharacterEncoding (line 63) | private void setCharacterEncoding(HttpServletResponse response) {
    method addVariablesToModel (line 69) | private void addVariablesToModel(Map<String, Object> model, HttpServle...
    method evaluateTemplate (line 77) | private void evaluateTemplate(Map<String, Object> model, HttpServletRe...
    method logElapsedTime (line 90) | private void logElapsedTime(long startNanoTime, HttpServletRequest req...
    method setCharacterEncoding (line 103) | public void setCharacterEncoding(String characterEncoding) {
    method setPebbleEngine (line 107) | public void setPebbleEngine(PebbleEngine pebbleEngine) {
    method setTemplateName (line 111) | public void setTemplateName(String name) {

FILE: pebble-spring/pebble-spring7/src/main/java/io/pebbletemplates/spring/servlet/PebbleViewResolver.java
  class PebbleViewResolver (line 15) | public class PebbleViewResolver extends AbstractTemplateViewResolver imp...
    method PebbleViewResolver (line 20) | public PebbleViewResolver(PebbleEngine pebbleEngine) {
    method afterPropertiesSet (line 25) | @Override
    method setCharacterEncoding (line 32) | public void setCharacterEncoding(String characterEncoding) {
    method buildView (line 36) | @Override
    method requiredViewClass (line 46) | @Override

FILE: pebble-spring/pebble-spring7/src/test/java/io/pebbletemplates/spring/PebbleViewResolverTest.java
  class PebbleViewResolverTest (line 40) | @ExtendWith(SpringExtension.class)
    method initRequest (line 57) | @BeforeEach
    method initBindingResult (line 65) | @BeforeEach
    method initBindingResultAllErrors (line 72) | private void initBindingResultAllErrors() {
    method initBindingResultGlobalErrors (line 81) | private void initBindingResultGlobalErrors() {
    method initBindingResultFieldErrors (line 90) | private void initBindingResultFieldErrors() {
    method whenRenderingAPage_givenPageWithBeanVariable_thenRenderingIsOK (line 100) | @Test
    method whenRenderingAPage_givenPageWithBindingResult_thenRenderingIsOK (line 107) | @Test
    method givenBindingResult (line 116) | private Map<String, Object> givenBindingResult() {
    method whenRenderingAPage_givenPageWithBindingResultAndMacro_thenRenderingIsOK (line 122) | @Test
    method whenRenderingAPage_givenPageWithHrefFunction_thenRenderingIsOK (line 131) | @Test
    method whenRenderingAPageInEnglish_givenPageWithResourceBundleMessage_thenRenderingIsOK (line 138) | @Test
    method whenRenderingAPageInFrench_givenPageWithResourceBundleMessage_thenRenderingIsOK (line 146) | @Test
    method whenRenderingAPage_givenPageWithHttpRequestVariable_thenRenderingIsOK (line 156) | @Test
    method whenRenderingAPage_givenPageWithHttpResponseVariable_thenRenderingIsOK (line 164) | @Test
    method whenRenderingAPage_givenPageWithHttpSessionVariable_thenRenderingIsOK (line 172) | @Test
    method assertOutput (line 180) | private void assertOutput(String output, String expectedOutput) throws...
    method readExpectedOutputResource (line 184) | private String readExpectedOutputResource(String expectedOutput) throw...
    method removeAllWhitespaces (line 197) | private String removeAllWhitespaces(String source) {
    method render (line 201) | private String render(String location, Map<String, ?> model) throws Ex...

FILE: pebble-spring/pebble-spring7/src/test/java/io/pebbletemplates/spring/bean/SomeBean.java
  class SomeBean (line 14) | public class SomeBean {
    method foo (line 16) | public String foo() {

FILE: pebble-spring/pebble-spring7/src/test/java/io/pebbletemplates/spring/config/MVCConfig.java
  class MVCConfig (line 26) | @Configuration(proxyBeanMethods = false)
    method foo (line 29) | @Bean
    method messageSource (line 34) | @Bean
    method pebbleEngine (line 42) | @Bean
    method springExtension (line 52) | @Bean
    method templateLoader (line 57) | @Bean
    method viewResolver (line 62) | @Bean

FILE: pebble/src/main/java/io/pebbletemplates/pebble/PebbleEngine.java
  class PebbleEngine (line 52) | public class PebbleEngine {
    method PebbleEngine (line 85) | private PebbleEngine(Loader<?> loader,
    method getTemplate (line 117) | public PebbleTemplate getTemplate(String templateName) {
    method getLiteralTemplate (line 128) | public PebbleTemplate getLiteralTemplate(String templateName) {
    method getTemplate (line 132) | private PebbleTemplate getTemplate(String templateName, Loader loader) {
    method getPebbleTemplate (line 150) | private PebbleTemplate getPebbleTemplate(String templateName, Loader l...
    method getLoader (line 189) | public Loader<?> getLoader() {
    method getTemplateCache (line 198) | public PebbleCache<Object, PebbleTemplate> getTemplateCache() {
    method isStrictVariables (line 207) | public boolean isStrictVariables() {
    method getDefaultLocale (line 216) | public Locale getDefaultLocale() {
    method getMaxRenderedSize (line 225) | public int getMaxRenderedSize() {
    method getExecutorService (line 234) | public ExecutorService getExecutorService() {
    method getSyntax (line 243) | public Syntax getSyntax() {
    method getExtensionRegistry (line 252) | public ExtensionRegistry getExtensionRegistry() {
    method getTagCache (line 261) | public PebbleCache<CacheKey, Object> getTagCache() {
    class Builder (line 268) | public static class Builder {
      method Builder (line 303) | public Builder() {
      method loader (line 313) | public Builder loader(Loader<?> loader) {
      method extension (line 324) | public Builder extension(Extension... extensions) {
      method syntax (line 335) | public Builder syntax(Syntax syntax) {
      method strictVariables (line 354) | public Builder strictVariables(boolean strictVariables) {
      method newLineTrimming (line 374) | public Builder newLineTrimming(boolean enableNewLineTrimming) {
      method defaultLocale (line 387) | public Builder defaultLocale(Locale defaultLocale) {
      method maxRenderedSize (line 400) | public Builder maxRenderedSize(int maxRenderedSize) {
      method executorService (line 412) | public Builder executorService(ExecutorService executorService) {
      method templateCache (line 423) | public Builder templateCache(PebbleCache<Object, PebbleTemplate> tem...
      method tagCache (line 434) | public Builder tagCache(PebbleCache<CacheKey, Object> tagCache) {
      method autoEscaping (line 446) | public Builder autoEscaping(boolean autoEscaping) {
      method allowOverrideCoreOperators (line 458) | public Builder allowOverrideCoreOperators(boolean allowOverrideCoreO...
      method defaultEscapingStrategy (line 469) | public Builder defaultEscapingStrategy(String strategy) {
      method addEscapingStrategy (line 481) | public Builder addEscapingStrategy(String name, EscapingStrategy str...
      method cacheActive (line 493) | public Builder cacheActive(boolean cacheActive) {
      method methodAccessValidator (line 504) | public Builder methodAccessValidator(MethodAccessValidator methodAcc...
      method literalDecimalTreatedAsInteger (line 516) | public Builder literalDecimalTreatedAsInteger(boolean literalDecimal...
      method literalNumbersAsBigDecimals (line 528) | public Builder literalNumbersAsBigDecimals(boolean literalNumbersAsB...
      method greedyMatchMethod (line 554) | public Builder greedyMatchMethod(boolean greedyMatchMethod) {
      method registerExtensionCustomizer (line 566) | public Builder registerExtensionCustomizer(Function<Extension, Exten...
      method build (line 576) | public PebbleEngine build() {
    method getEvaluationOptions (line 621) | public EvaluationOptions getEvaluationOptions() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/ArrayResolver.java
  class ArrayResolver (line 9) | class ArrayResolver implements AttributeResolver {
    method ArrayResolver (line 13) | private ArrayResolver() {
    method resolve (line 16) | @Override
    method getIndex (line 39) | private int getIndex(String attributeName) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/AttributeResolver.java
  type AttributeResolver (line 9) | public interface AttributeResolver {
    method resolve (line 25) | ResolvedAttribute resolve(Object instance,

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/DefaultAttributeResolver.java
  class DefaultAttributeResolver (line 16) | public class DefaultAttributeResolver implements AttributeResolver {
    method resolve (line 20) | @Override
    method getArgumentTypes (line 75) | private Class<?>[] getArgumentTypes(Object[] argumentValues) {
    method invokeMember (line 96) | private Object invokeMember(Object object, Member member, Object[] arg...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/ListResolver.java
  class ListResolver (line 9) | class ListResolver implements AttributeResolver {
    method ListResolver (line 13) | private ListResolver() {
    method resolve (line 16) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/MacroResolver.java
  class MacroResolver (line 7) | class MacroResolver implements AttributeResolver {
    method MacroResolver (line 11) | private MacroResolver() {
    method resolve (line 14) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/MapResolver.java
  class MapResolver (line 10) | class MapResolver implements AttributeResolver {
    method MapResolver (line 14) | private MapResolver() {
    method resolve (line 17) | @Override
    method cast (line 52) | private Object cast(Number number,

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/MemberCacheUtils.java
  class MemberCacheUtils (line 13) | class MemberCacheUtils {
    method getMember (line 17) | Member getMember(Object instance, String attributeName, Class<?>[] arg...
    method cacheMember (line 21) | Member cacheMember(Object instance,
    method reflect (line 37) | private Member reflect(Object object, String attributeName, Class<?>[]...
    method findMethod (line 98) | private Method findMethod(Object object, Class<?> clazz, String name, ...
    method verifyUnsafeMethod (line 159) | private void verifyUnsafeMethod(String filename, int lineNumber,
    method widen (line 172) | private Class<?> widen(Class<?> clazz) {
    method getCandidates (line 197) | private List<Method> getCandidates(Class<?> clazz, String name, Object...
    method isCompatibleType (line 214) | private boolean isCompatibleType(Class<?> type1, Class<?> type2) {
    class MemberCacheKey (line 219) | private class MemberCacheKey {
      method MemberCacheKey (line 225) | public MemberCacheKey(Class<?> clazz, String attributeName, Class<?>...
      method equals (line 231) | @Override
      method hashCode (line 252) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/ResolvedAttribute.java
  class ResolvedAttribute (line 3) | public final class ResolvedAttribute {
    method ResolvedAttribute (line 7) | public ResolvedAttribute(Object evaluatedValue) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/methodaccess/BlacklistMethodAccessValidator.java
  class BlacklistMethodAccessValidator (line 6) | public class BlacklistMethodAccessValidator implements MethodAccessValid...
    method isMethodAccessAllowed (line 13) | @Override
    method isUnsafeMethod (line 25) | private boolean isUnsafeMethod(Method member) {
    method isAnyOfMethods (line 29) | private boolean isAnyOfMethods(Method member, String... methods) {
    method isMethodWithName (line 38) | private boolean isMethodWithName(Method member, String method) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/methodaccess/MethodAccessValidator.java
  type MethodAccessValidator (line 5) | public interface MethodAccessValidator {
    method isMethodAccessAllowed (line 7) | boolean isMethodAccessAllowed(Object object, Method method);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/attributes/methodaccess/NoOpMethodAccessValidator.java
  class NoOpMethodAccessValidator (line 5) | public class NoOpMethodAccessValidator implements MethodAccessValidator {
    method isMethodAccessAllowed (line 7) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/CacheKey.java
  class CacheKey (line 12) | public class CacheKey {
    method CacheKey (line 18) | public CacheKey(CacheNode node, String name, Locale locale) {
    method equals (line 29) | @Override
    method hashCode (line 60) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/PebbleCache.java
  type PebbleCache (line 5) | public interface PebbleCache<K, V> {
    method computeIfAbsent (line 7) | V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunct...
    method invalidateAll (line 9) | void invalidateAll();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/tag/CaffeineTagCache.java
  class CaffeineTagCache (line 10) | public class CaffeineTagCache implements PebbleCache<CacheKey, Object> {
    method CaffeineTagCache (line 14) | public CaffeineTagCache() {
    method CaffeineTagCache (line 20) | public CaffeineTagCache(Cache<CacheKey, Object> tagCache) {
    method computeIfAbsent (line 24) | @Override
    method invalidateAll (line 29) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/tag/ConcurrentMapTagCache.java
  class ConcurrentMapTagCache (line 10) | public class ConcurrentMapTagCache implements PebbleCache<CacheKey, Obje...
    method ConcurrentMapTagCache (line 14) | public ConcurrentMapTagCache() {
    method ConcurrentMapTagCache (line 18) | public ConcurrentMapTagCache(ConcurrentMap<CacheKey, Object> tagCache) {
    method computeIfAbsent (line 22) | @Override
    method invalidateAll (line 28) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/tag/NoOpTagCache.java
  class NoOpTagCache (line 8) | public class NoOpTagCache implements PebbleCache<CacheKey, Object> {
    method computeIfAbsent (line 10) | @Override
    method invalidateAll (line 16) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/template/CaffeineTemplateCache.java
  class CaffeineTemplateCache (line 10) | public class CaffeineTemplateCache implements PebbleCache<Object, Pebble...
    method CaffeineTemplateCache (line 14) | public CaffeineTemplateCache() {
    method CaffeineTemplateCache (line 20) | public CaffeineTemplateCache(Cache<Object, PebbleTemplate> templateCac...
    method computeIfAbsent (line 24) | @Override
    method invalidateAll (line 30) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/template/ConcurrentMapTemplateCache.java
  class ConcurrentMapTemplateCache (line 10) | public class ConcurrentMapTemplateCache implements PebbleCache<Object, P...
    method ConcurrentMapTemplateCache (line 14) | public ConcurrentMapTemplateCache() {
    method ConcurrentMapTemplateCache (line 18) | public ConcurrentMapTemplateCache(ConcurrentMap<Object, PebbleTemplate...
    method computeIfAbsent (line 22) | @Override
    method invalidateAll (line 28) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/cache/template/NoOpTemplateCache.java
  class NoOpTemplateCache (line 8) | public class NoOpTemplateCache implements PebbleCache<Object, PebbleTemp...
    method computeIfAbsent (line 10) | @Override
    method invalidateAll (line 16) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/error/AttributeNotFoundException.java
  class AttributeNotFoundException (line 11) | public class AttributeNotFoundException extends PebbleException {
    method AttributeNotFoundException (line 17) | public AttributeNotFoundException(Throwable cause, String message, Str...
    method getAttributeName (line 24) | public String getAttributeName() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/error/ClassAccessException.java
  class ClassAccessException (line 13) | public class ClassAccessException extends PebbleException {
    method ClassAccessException (line 17) | public ClassAccessException(Method method, String filename, Integer li...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/error/LoaderException.java
  class LoaderException (line 11) | public class LoaderException extends PebbleException {
    method LoaderException (line 15) | public LoaderException(Throwable cause, String message) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/error/ParserException.java
  class ParserException (line 11) | public class ParserException extends PebbleException {
    method ParserException (line 15) | public ParserException(Throwable cause, String message, int lineNumber...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/error/PebbleException.java
  class PebbleException (line 11) | public class PebbleException extends RuntimeException {
    method PebbleException (line 21) | public PebbleException(Throwable cause, String message) {
    method PebbleException (line 25) | public PebbleException(Throwable cause, String message, Integer lineNu...
    method getLineNumber (line 38) | public Integer getLineNumber() {
    method getFileName (line 47) | public String getFileName() {
    method getPebbleMessage (line 57) | public String getPebbleMessage() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/error/RootAttributeNotFoundException.java
  class RootAttributeNotFoundException (line 11) | public class RootAttributeNotFoundException extends AttributeNotFoundExc...
    method RootAttributeNotFoundException (line 15) | public RootAttributeNotFoundException(Throwable cause, String message,...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/AbstractExtension.java
  class AbstractExtension (line 18) | public abstract class AbstractExtension implements Extension {
    method getTokenParsers (line 20) | @Override
    method getBinaryOperators (line 25) | @Override
    method getUnaryOperators (line 30) | @Override
    method getFilters (line 35) | @Override
    method getTests (line 40) | @Override
    method getFunctions (line 45) | @Override
    method getGlobalVariables (line 50) | @Override
    method getNodeVisitors (line 55) | @Override
    method getAttributeResolver (line 60) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/AbstractNodeVisitor.java
  class AbstractNodeVisitor (line 39) | public class AbstractNodeVisitor implements NodeVisitor {
    method AbstractNodeVisitor (line 43) | public AbstractNodeVisitor(PebbleTemplateImpl template) {
    method visit (line 50) | @Override
    method visit (line 57) | @Override
    method visit (line 71) | @Override
    method visit (line 76) | @Override
    method visit (line 81) | @Override
    method visit (line 88) | @Override
    method visit (line 93) | @Override
    method visit (line 98) | @Override
    method visit (line 107) | @Override
    method visit (line 118) | @Override
    method visit (line 123) | @Override
    method visit (line 128) | @Override
    method visit (line 134) | @Override
    method visit (line 141) | @Override
    method visit (line 146) | @Override
    method visit (line 151) | @Override
    method visit (line 156) | @Override
    method visit (line 161) | @Override
    method visit (line 166) | @Override
    method getTemplate (line 171) | protected PebbleTemplateImpl getTemplate() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/Extension.java
  type Extension (line 18) | public interface Extension {
    method getFilters (line 25) | Map<String, Filter> getFilters();
    method getTests (line 32) | Map<String, Test> getTests();
    method getFunctions (line 39) | Map<String, Function> getFunctions();
    method getTokenParsers (line 49) | List<TokenParser> getTokenParsers();
    method getBinaryOperators (line 56) | List<BinaryOperator> getBinaryOperators();
    method getUnaryOperators (line 63) | List<UnaryOperator> getUnaryOperators();
    method getGlobalVariables (line 70) | Map<String, Object> getGlobalVariables();
    method getNodeVisitors (line 77) | List<NodeVisitorFactory> getNodeVisitors();
    method getAttributeResolver (line 84) | List<AttributeResolver> getAttributeResolver();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/ExtensionCustomizer.java
  class ExtensionCustomizer (line 25) | public abstract class ExtensionCustomizer implements Extension {
    method ExtensionCustomizer (line 29) | public ExtensionCustomizer(Extension delegate) {
    method getFilters (line 33) | @Override
    method getTests (line 38) | @Override
    method getFunctions (line 43) | @Override
    method getTokenParsers (line 48) | @Override
    method getBinaryOperators (line 53) | @Override
    method getUnaryOperators (line 58) | @Override
    method getGlobalVariables (line 63) | @Override
    method getNodeVisitors (line 68) | @Override
    method getAttributeResolver (line 73) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/ExtensionRegistry.java
  class ExtensionRegistry (line 18) | public class ExtensionRegistry {
    method ExtensionRegistry (line 62) | public ExtensionRegistry() {
    method ExtensionRegistry (line 65) | public ExtensionRegistry(Collection<? extends Extension> extensions) {
    method addOperatorOverridingExtension (line 72) | public void addOperatorOverridingExtension(Extension extension) {
    method addExtension (line 76) | public void addExtension(Extension extension) {
    method addExtension (line 80) | private void addExtension(Extension extension, boolean operatorOverrid...
    method getFilter (line 150) | public Filter getFilter(String name) {
    method getTest (line 154) | public Test getTest(String name) {
    method getFunction (line 158) | public Function getFunction(String name) {
    method getBinaryOperators (line 162) | public Map<String, BinaryOperator> getBinaryOperators() {
    method getUnaryOperators (line 166) | public Map<String, UnaryOperator> getUnaryOperators() {
    method getNodeVisitors (line 170) | public List<NodeVisitorFactory> getNodeVisitors() {
    method getGlobalVariables (line 174) | public Map<String, Object> getGlobalVariables() {
    method getTokenParsers (line 178) | public Map<String, TokenParser> getTokenParsers() {
    method getAttributeResolver (line 182) | public List<AttributeResolver> getAttributeResolver() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/ExtensionRegistryFactory.java
  class ExtensionRegistryFactory (line 19) | public class ExtensionRegistryFactory {
    method buildExtensionRegistry (line 29) | public ExtensionRegistry buildExtensionRegistry() {
    method autoEscaping (line 49) | public void autoEscaping(boolean autoEscaping) {
    method addEscapingStrategy (line 53) | public void addEscapingStrategy(String name, EscapingStrategy strategy) {
    method extension (line 57) | public void extension(Extension... extensions) {
    method allowOverrideCoreOperators (line 61) | public void allowOverrideCoreOperators(boolean allowOverrideCoreOperat...
    method defaultEscapingStrategy (line 65) | public void defaultEscapingStrategy(String strategy) {
    method registerExtensionCustomizer (line 69) | public void registerExtensionCustomizer(Function<Extension, ExtensionC...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/Filter.java
  type Filter (line 17) | public interface Filter extends NamedArguments {
    method apply (line 19) | Object apply(Object input, Map<String, Object> args, PebbleTemplate self,

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/Function.java
  type Function (line 16) | public interface Function extends NamedArguments {
    method execute (line 18) | Object execute(Map<String, Object> args, PebbleTemplate self, Evaluati...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/NamedArguments.java
  type NamedArguments (line 13) | public interface NamedArguments {
    method getArgumentNames (line 15) | List<String> getArgumentNames();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/NodeVisitor.java
  type NodeVisitor (line 42) | public interface NodeVisitor {
    method visit (line 49) | void visit(Node node);
    method visit (line 54) | void visit(ArgumentsNode node);
    method visit (line 56) | void visit(AutoEscapeNode node);
    method visit (line 58) | void visit(BlockNode node);
    method visit (line 60) | void visit(BodyNode node);
    method visit (line 62) | void visit(ExtendsNode node);
    method visit (line 64) | void visit(FlushNode node);
    method visit (line 66) | void visit(ForNode node);
    method visit (line 68) | void visit(IfNode node);
    method visit (line 70) | void visit(ImportNode node);
    method visit (line 72) | void visit(IncludeNode node);
    method visit (line 74) | void visit(MacroNode node);
    method visit (line 76) | void visit(NamedArgumentNode node);
    method visit (line 78) | void visit(ParallelNode node);
    method visit (line 80) | void visit(PositionalArgumentNode node);
    method visit (line 82) | void visit(PrintNode node);
    method visit (line 84) | void visit(RootNode node);
    method visit (line 86) | void visit(SetNode node);
    method visit (line 88) | void visit(TextNode node);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/NodeVisitorFactory.java
  type NodeVisitorFactory (line 13) | public interface NodeVisitorFactory {
    method createVisitor (line 28) | NodeVisitor createVisitor(PebbleTemplate template);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/Test.java
  type Test (line 17) | public interface Test extends NamedArguments {
    method apply (line 19) | boolean apply(Object input, Map<String, Object> args, PebbleTemplate s...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/AbbreviateFilter.java
  class AbbreviateFilter (line 20) | public class AbbreviateFilter implements Filter {
    method AbbreviateFilter (line 24) | public AbbreviateFilter() {
    method getArgumentNames (line 28) | @Override
    method apply (line 33) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/AbsFilter.java
  class AbsFilter (line 21) | public class AbsFilter implements Filter {
    method getArgumentNames (line 23) | @Override
    method apply (line 28) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/AttributeResolverExtension.java
  class AttributeResolverExtension (line 10) | public class AttributeResolverExtension extends AbstractExtension {
    method getAttributeResolver (line 12) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Base64DecoderFilter.java
  class Base64DecoderFilter (line 18) | public class Base64DecoderFilter implements Filter {
    method getArgumentNames (line 22) | @Override
    method apply (line 27) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Base64EncoderFilter.java
  class Base64EncoderFilter (line 18) | public class Base64EncoderFilter implements Filter {
    method getArgumentNames (line 22) | @Override
    method apply (line 27) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/CapitalizeFilter.java
  class CapitalizeFilter (line 19) | public class CapitalizeFilter implements Filter {
    method getArgumentNames (line 21) | @Override
    method apply (line 26) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/CoreExtension.java
  class CoreExtension (line 64) | public class CoreExtension extends AbstractExtension {
    method getTokenParsers (line 66) | @Override
    method getUnaryOperators (line 88) | @Override
    method getBinaryOperators (line 97) | @Override
    method getFilters (line 124) | @Override
    method getTests (line 157) | @Override
    method getFunctions (line 170) | @Override
    method getGlobalVariables (line 186) | @Override
    method getNodeVisitors (line 191) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DateFilter.java
  class DateFilter (line 28) | public class DateFilter implements Filter {
    method DateFilter (line 32) | public DateFilter() {
    method getArgumentNames (line 38) | @Override
    method apply (line 43) | @Override
    method applyDate (line 62) | private Object applyDate(Object dateOrString, final PebbleTemplate sel...
    method applyTemporal (line 99) | private Object applyTemporal(final TemporalAccessor input, PebbleTempl...
    method getZoneId (line 120) | private ZoneId getZoneId(TemporalAccessor input, String timeZone) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DefaultFilter.java
  class DefaultFilter (line 22) | public class DefaultFilter implements Filter {
    method DefaultFilter (line 26) | public DefaultFilter() {
    method getArgumentNames (line 30) | @Override
    method apply (line 35) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DefinedTest.java
  class DefinedTest (line 16) | public class DefinedTest extends NullTest {
    method apply (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DisallowExtensionCustomizerBuilder.java
  class DisallowExtensionCustomizerBuilder (line 19) | public class DisallowExtensionCustomizerBuilder {
    method disallowedFunctionKeys (line 33) | public DisallowExtensionCustomizerBuilder disallowedFunctionKeys(Colle...
    method disallowedTokenParserTags (line 38) | public DisallowExtensionCustomizerBuilder disallowedTokenParserTags(Co...
    method disallowedFilterKeys (line 43) | public DisallowExtensionCustomizerBuilder disallowedFilterKeys(Collect...
    method disallowedUnaryOperatorSymbols (line 48) | public DisallowExtensionCustomizerBuilder disallowedUnaryOperatorSymbo...
    method disallowedBinaryOperatorSymbols (line 53) | public DisallowExtensionCustomizerBuilder disallowedBinaryOperatorSymb...
    method disallowedTestKeys (line 58) | public DisallowExtensionCustomizerBuilder disallowedTestKeys(Collectio...
    method build (line 63) | public Function<Extension, ExtensionCustomizer> build() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/EmptyTest.java
  class EmptyTest (line 19) | public class EmptyTest implements Test {
    method getArgumentNames (line 21) | @Override
    method apply (line 26) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/EvenTest.java
  class EvenTest (line 19) | public class EvenTest implements Test {
    method getArgumentNames (line 21) | @Override
    method apply (line 26) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/FirstFilter.java
  class FirstFilter (line 26) | public class FirstFilter implements Filter {
    method getArgumentNames (line 28) | @Override
    method apply (line 33) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/FormatFilter.java
  class FormatFilter (line 21) | public class FormatFilter implements Filter {
    method FormatFilter (line 25) | public FormatFilter() {
    method getArgumentNames (line 28) | @Override
    method apply (line 33) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/IterableTest.java
  class IterableTest (line 18) | public class IterableTest implements Test {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/JoinFilter.java
  class JoinFilter (line 28) | public class JoinFilter implements Filter {
    method JoinFilter (line 32) | public JoinFilter() {
    method getArgumentNames (line 36) | @Override
    method apply (line 41) | @Override
    method join (line 71) | private String join(Collection<?> inputCollection, String glue) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/LastFilter.java
  class LastFilter (line 25) | public class LastFilter implements Filter {
    method getArgumentNames (line 27) | @Override
    method apply (line 32) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/LengthFilter.java
  class LengthFilter (line 13) | public class LengthFilter implements Filter {
    method getArgumentNames (line 15) | @Override
    method apply (line 20) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/LowerFilter.java
  class LowerFilter (line 18) | public class LowerFilter implements Filter {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MacroAndBlockRegistrantNodeVisitor.java
  class MacroAndBlockRegistrantNodeVisitor (line 17) | public class MacroAndBlockRegistrantNodeVisitor extends AbstractNodeVisi...
    method MacroAndBlockRegistrantNodeVisitor (line 19) | public MacroAndBlockRegistrantNodeVisitor(PebbleTemplateImpl template) {
    method visit (line 23) | @Override
    method visit (line 29) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MacroAndBlockRegistrantNodeVisitorFactory.java
  class MacroAndBlockRegistrantNodeVisitorFactory (line 13) | public class MacroAndBlockRegistrantNodeVisitorFactory implements NodeVi...
    method createVisitor (line 15) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MapTest.java
  class MapTest (line 18) | public class MapTest implements Test {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MaxFunction.java
  class MaxFunction (line 18) | public class MaxFunction implements Function {
    method getArgumentNames (line 20) | @Override
    method execute (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MergeFilter.java
  class MergeFilter (line 22) | public class MergeFilter implements Filter {
    method MergeFilter (line 28) | public MergeFilter() {
    method getArgumentNames (line 32) | @Override
    method apply (line 37) | @Override
    method mergeAsMap (line 64) | private Object mergeAsMap(Map<?, ?> arg1, Object arg2) {
    method mergeAsList (line 86) | private Object mergeAsList(List<?> arg1, Object arg2, int lineNumber, ...
    method mergeAsArray (line 107) | private Object mergeAsArray(Object arg1, Object arg2, int lineNumber, ...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MinFunction.java
  class MinFunction (line 18) | public class MinFunction implements Function {
    method getArgumentNames (line 20) | @Override
    method execute (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Nl2brFilter.java
  class Nl2brFilter (line 11) | public class Nl2brFilter implements Filter {
    method apply (line 14) | @Override
    method getArgumentNames (line 36) | @Override
    method convertNewlinesToBr (line 41) | private String convertNewlinesToBr(String input, StringBuilder sb) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/NullTest.java
  class NullTest (line 18) | public class NullTest implements Test {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/NumberFormatFilter.java
  class NumberFormatFilter (line 25) | public class NumberFormatFilter implements Filter {
    method NumberFormatFilter (line 29) | public NumberFormatFilter() {
    method getArgumentNames (line 33) | @Override
    method apply (line 38) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/OddTest.java
  class OddTest (line 19) | public class OddTest implements Test {
    method getArgumentNames (line 21) | @Override
    method apply (line 26) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/RangeFunction.java
  class RangeFunction (line 25) | public class RangeFunction implements Function {
    method RangeFunction (line 37) | public RangeFunction() {
    method execute (line 43) | @Override
    method getArgumentNames (line 114) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/ReplaceFilter.java
  class ReplaceFilter (line 19) | public class ReplaceFilter implements Filter {
    method getArgumentNames (line 27) | @Override
    method apply (line 32) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/ReverseFilter.java
  class ReverseFilter (line 16) | public class ReverseFilter implements Filter {
    method getArgumentNames (line 18) | @Override
    method apply (line 23) | @SuppressWarnings({"rawtypes", "unchecked"})

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/RsortFilter.java
  class RsortFilter (line 24) | public class RsortFilter implements Filter {
    method getArgumentNames (line 26) | @Override
    method apply (line 31) | @SuppressWarnings({"rawtypes", "unchecked"})

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Sha256Filter.java
  class Sha256Filter (line 18) | public class Sha256Filter implements Filter {
    method getArgumentNames (line 22) | @Override
    method apply (line 27) | @Override
    method bytesToHex (line 49) | private static String bytesToHex(byte[] bytes) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/SliceFilter.java
  class SliceFilter (line 22) | public class SliceFilter implements Filter {
    method SliceFilter (line 26) | public SliceFilter() {
    method getArgumentNames (line 31) | @Override
    method apply (line 36) | @Override
    method sliceArray (line 110) | private static Object sliceArray(Object input, int from, int to) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/SortFilter.java
  class SortFilter (line 21) | public class SortFilter implements Filter {
    method getArgumentNames (line 23) | @Override
    method apply (line 28) | @SuppressWarnings({"rawtypes", "unchecked"})

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/SplitFilter.java
  class SplitFilter (line 12) | public class SplitFilter implements Filter {
    method SplitFilter (line 20) | public SplitFilter() {
    method apply (line 25) | @Override
    method getArgumentNames (line 45) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/TitleFilter.java
  class TitleFilter (line 18) | public class TitleFilter implements Filter {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/TrimFilter.java
  class TrimFilter (line 18) | public class TrimFilter implements Filter {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/UpperFilter.java
  class UpperFilter (line 18) | public class UpperFilter implements Filter {
    method getArgumentNames (line 20) | @Override
    method apply (line 25) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/core/UrlEncoderFilter.java
  class UrlEncoderFilter (line 20) | public class UrlEncoderFilter implements Filter {
    method getArgumentNames (line 22) | @Override
    method apply (line 27) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/debug/DebugExtension.java
  class DebugExtension (line 17) | public class DebugExtension extends AbstractExtension {
    method getNodeVisitors (line 21) | public List<NodeVisitorFactory> getNodeVisitors() {
    method toString (line 27) | public String toString() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/debug/PrettyPrintNodeVisitor.java
  class PrettyPrintNodeVisitor (line 38) | public class PrettyPrintNodeVisitor extends AbstractNodeVisitor {
    method PrettyPrintNodeVisitor (line 40) | public PrettyPrintNodeVisitor(PebbleTemplateImpl template) {
    method write (line 48) | private void write(String message) {
    method toString (line 58) | public String toString() {
    method visit (line 65) | @Override
    method visit (line 73) | @Override
    method visit (line 81) | @Override
    method visit (line 89) | @Override
    method visit (line 97) | public void visit(BinaryExpression<?> node) {
    method visit (line 104) | public void visit(UnaryExpression node) {
    method visit (line 111) | public void visit(ContextVariableExpression node) {
    method visit (line 118) | public void visit(FilterInvocationExpression node) {
    method visit (line 125) | public void visit(FunctionOrMacroInvocationExpression node) {
    method visit (line 132) | public void visit(GetAttributeExpression node) {
    method visit (line 139) | @Override
    method visit (line 147) | @Override
    method visit (line 155) | public void visit(ParentFunctionExpression node) {
    method visit (line 162) | public void visit(TernaryExpression node) {
    method visit (line 169) | public void visit(TestInvocationExpression node) {
    method visit (line 176) | @Override
    method visit (line 184) | @Override
    method visit (line 192) | @Override
    method visit (line 200) | @Override
    method visit (line 208) | @Override
    method visit (line 216) | @Override
    method visit (line 224) | @Override
    method visit (line 232) | @Override
    method visit (line 240) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/debug/PrettyPrintNodeVisitorFactory.java
  class PrettyPrintNodeVisitorFactory (line 11) | public class PrettyPrintNodeVisitorFactory implements NodeVisitorFactory {
    method createVisitor (line 13) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/EscapeFilter.java
  class EscapeFilter (line 27) | public class EscapeFilter implements Filter {
    method EscapeFilter (line 41) | public EscapeFilter() {
    method buildDefaultStrategies (line 46) | private void buildDefaultStrategies() {
    method getArgumentNames (line 54) | @Override
    method apply (line 59) | @Override
    method getDefaultStrategy (line 81) | public String getDefaultStrategy() {
    method setDefaultStrategy (line 85) | public void setDefaultStrategy(String defaultStrategy) {
    method addEscapingStrategy (line 89) | public void addEscapingStrategy(String name, EscapingStrategy strategy) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/EscaperExtension.java
  class EscaperExtension (line 22) | public class EscaperExtension extends AbstractExtension {
    method EscaperExtension (line 28) | public EscaperExtension() {
    method getFilters (line 33) | @Override
    method getTokenParsers (line 41) | @Override
    method getNodeVisitors (line 48) | @Override
    method setDefaultStrategy (line 60) | public void setDefaultStrategy(String strategy) {
    method setAutoEscaping (line 67) | public void setAutoEscaping(boolean auto) {
    method addEscapingStrategy (line 77) | public void addEscapingStrategy(String name, EscapingStrategy strategy) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/EscaperNodeVisitor.java
  class EscaperNodeVisitor (line 30) | public class EscaperNodeVisitor extends AbstractNodeVisitor {
    method EscaperNodeVisitor (line 36) | public EscaperNodeVisitor(PebbleTemplateImpl template, boolean autoEsc...
    method visit (line 41) | @Override
    method visit (line 62) | @Override
    method escape (line 76) | private Expression<?> escape(Expression<?> expression) {
    method isUnsafe (line 106) | private boolean isUnsafe(Expression<?> expression) {
    method isSafeConcatenateExpr (line 132) | private boolean isSafeConcatenateExpr(Expression<?> expr) {
    method pushAutoEscapeState (line 141) | public void pushAutoEscapeState(boolean auto) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/EscaperNodeVisitorFactory.java
  class EscaperNodeVisitorFactory (line 13) | public class EscaperNodeVisitorFactory implements NodeVisitorFactory {
    method createVisitor (line 17) | @Override
    method setAutoEscaping (line 22) | public void setAutoEscaping(boolean auto) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/EscapingStrategy.java
  type EscapingStrategy (line 3) | public interface EscapingStrategy {
    method escape (line 5) | String escape(String input);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/RawFilter.java
  class RawFilter (line 18) | public class RawFilter implements Filter {
    method getArgumentNames (line 20) | public List<String> getArgumentNames() {
    method apply (line 24) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/escaper/SafeString.java
  class SafeString (line 9) | public class SafeString {
    method SafeString (line 13) | public SafeString(String content) {
    method toString (line 17) | @Override
    method equals (line 22) | @Override
    method hashCode (line 27) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/i18n/I18nExtension.java
  class I18nExtension (line 17) | public class I18nExtension extends AbstractExtension {
    method getFunctions (line 19) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/i18n/UTF8Control.java
  class UTF8Control (line 13) | public class UTF8Control extends ResourceBundle.Control {
    method newBundle (line 15) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/i18n/i18nFunction.java
  class i18nFunction (line 22) | public class i18nFunction implements Function {
    method i18nFunction (line 26) | public i18nFunction() {
    method getArgumentNames (line 32) | @Override
    method execute (line 37) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/writer/PooledSpecializedStringWriter.java
  class PooledSpecializedStringWriter (line 16) | public class PooledSpecializedStringWriter extends Writer implements Spe...
    method PooledSpecializedStringWriter (line 23) | private PooledSpecializedStringWriter() {
    method writeSpecialized (line 26) | @Override
    method writeSpecialized (line 31) | @Override
    method writeSpecialized (line 36) | @Override
    method writeSpecialized (line 41) | @Override
    method writeSpecialized (line 46) | @Override
    method writeSpecialized (line 51) | @Override
    method writeSpecialized (line 56) | @Override
    method writeSpecialized (line 61) | @Override
    method write (line 66) | @Override
    method flush (line 71) | @Override
    method close (line 75) | @Override
    method toString (line 79) | @Override
    method pooled (line 84) | public static PooledSpecializedStringWriter pooled() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/writer/SpecializedWriter.java
  type SpecializedWriter (line 9) | public interface SpecializedWriter {
    method writeSpecialized (line 11) | void writeSpecialized(int i);
    method writeSpecialized (line 13) | void writeSpecialized(long l);
    method writeSpecialized (line 15) | void writeSpecialized(double d);
    method writeSpecialized (line 17) | void writeSpecialized(float f);
    method writeSpecialized (line 19) | void writeSpecialized(short s);
    method writeSpecialized (line 21) | void writeSpecialized(byte b);
    method writeSpecialized (line 23) | void writeSpecialized(char c);
    method writeSpecialized (line 25) | void writeSpecialized(String s);
    method write (line 27) | default void write(Object o) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/extension/writer/StringWriterSpecializedAdapter.java
  class StringWriterSpecializedAdapter (line 10) | public class StringWriterSpecializedAdapter implements SpecializedWriter {
    method StringWriterSpecializedAdapter (line 14) | public StringWriterSpecializedAdapter(StringWriter sw) {
    method writeSpecialized (line 18) | @Override
    method writeSpecialized (line 23) | @Override
    method writeSpecialized (line 28) | @Override
    method writeSpecialized (line 33) | @Override
    method writeSpecialized (line 38) | @Override
    method writeSpecialized (line 43) | @Override
    method writeSpecialized (line 48) | @Override
    method writeSpecialized (line 53) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/lexer/Lexer.java
  type Lexer (line 13) | public interface Lexer {
    method tokenize (line 15) | TokenStream tokenize(Reader templateReader, String name);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/lexer/LexerImpl.java
  class LexerImpl (line 35) | public final class LexerImpl implements Lexer {
    type State (line 79) | private enum State {
    method LexerImpl (line 140) | public LexerImpl(Syntax syntax, Collection<UnaryOperator> unaryOperators,
    method tokenize (line 153) | @Override
    method tokenizeStringInterpolation (line 222) | private void tokenizeStringInterpolation() {
    method tokenizeString (line 236) | private void tokenizeString() {
    method tokenizeData (line 278) | private void tokenizeData() {
    method tokenizeBetweenExecuteDelimiters (line 336) | private void tokenizeBetweenExecuteDelimiters() {
    method tokenizeBetweenPrintDelimiters (line 356) | private void tokenizeBetweenPrintDelimiters() {
    method tokenizeComment (line 378) | private void tokenizeComment() {
    method tokenizeExpression (line 409) | private void tokenizeExpression() {
    method unquoteAndUnescape (line 516) | private String unquoteAndUnescape(String str) {
    method checkForLeadingWhitespaceTrim (line 531) | private void checkForLeadingWhitespaceTrim(Token leadingToken) {
    method checkForTrailingWhitespaceTrim (line 547) | private void checkForTrailingWhitespaceTrim() {
    method lexVerbatimData (line 559) | private void lexVerbatimData(Matcher verbatimStartMatcher) {
    method pushToken (line 602) | private Token pushToken(Token.Type type) {
    method pushToken (line 614) | private Token pushToken(Token.Type type, String value) {
    method popState (line 631) | private void popState() {
    method buildOperatorRegex (line 639) | private void buildOperatorRegex() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/lexer/Syntax.java
  class Syntax (line 12) | public final class Syntax {
    method Syntax (line 59) | public Syntax(final String delimiterCommentOpen, final String delimite...
    method getCommentOpenDelimiter (line 115) | public String getCommentOpenDelimiter() {
    method getCommentCloseDelimiter (line 122) | public String getCommentCloseDelimiter() {
    method getExecuteOpenDelimiter (line 129) | public String getExecuteOpenDelimiter() {
    method getExecuteCloseDelimiter (line 136) | public String getExecuteCloseDelimiter() {
    method getPrintOpenDelimiter (line 143) | public String getPrintOpenDelimiter() {
    method getPrintCloseDelimiter (line 150) | public String getPrintCloseDelimiter() {
    method getInterpolationOpenDelimiter (line 154) | public String getInterpolationOpenDelimiter() {
    method getInterpolationCloseDelimiter (line 158) | public String getInterpolationCloseDelimiter() {
    method getWhitespaceTrim (line 162) | public String getWhitespaceTrim() {
    method getRegexPrintClose (line 166) | Pattern getRegexPrintClose() {
    method getRegexExecuteClose (line 170) | Pattern getRegexExecuteClose() {
    method getRegexCommentClose (line 174) | Pattern getRegexCommentClose() {
    method getRegexStartDelimiters (line 178) | Pattern getRegexStartDelimiters() {
    method getRegexLeadingWhitespaceTrim (line 182) | Pattern getRegexLeadingWhitespaceTrim() {
    method getRegexTrailingWhitespaceTrim (line 186) | Pattern getRegexTrailingWhitespaceTrim() {
    method getRegexVerbatimEnd (line 190) | Pattern getRegexVerbatimEnd() {
    method getRegexVerbatimStart (line 194) | Pattern getRegexVerbatimStart() {
    method getRegexInterpolationOpen (line 198) | Pattern getRegexInterpolationOpen() {
    method getRegexInterpolationClose (line 202) | Pattern getRegexInterpolationClose() {
    class Builder (line 209) | public static class Builder {
      method getCommentOpenDelimiter (line 234) | public String getCommentOpenDelimiter() {
      method setCommentOpenDelimiter (line 242) | public Builder setCommentOpenDelimiter(String commentOpenDelimiter) {
      method getCommentCloseDelimiter (line 250) | public String getCommentCloseDelimiter() {
      method setCommentCloseDelimiter (line 258) | public Builder setCommentCloseDelimiter(String commentCloseDelimiter) {
      method getExecuteOpenDelimiter (line 266) | public String getExecuteOpenDelimiter() {
      method setExecuteOpenDelimiter (line 274) | public Builder setExecuteOpenDelimiter(String executeOpenDelimiter) {
      method getExecuteCloseDelimiter (line 282) | public String getExecuteCloseDelimiter() {
      method setExecuteCloseDelimiter (line 290) | public Builder setExecuteCloseDelimiter(String executeCloseDelimiter) {
      method getPrintOpenDelimiter (line 298) | public String getPrintOpenDelimiter() {
      method setPrintOpenDelimiter (line 306) | public Builder setPrintOpenDelimiter(String printOpenDelimiter) {
      method getPrintCloseDelimiter (line 314) | public String getPrintCloseDelimiter() {
      method setPrintCloseDelimiter (line 322) | public Builder setPrintCloseDelimiter(String printCloseDelimiter) {
      method getWhitespaceTrim (line 327) | public String getWhitespaceTrim() {
      method setWhitespaceTrim (line 331) | public Builder setWhitespaceTrim(String whitespaceTrim) {
      method getInterpolationOpenDelimiter (line 336) | public String getInterpolationOpenDelimiter() {
      method setInterpolationOpenDelimiter (line 340) | public void setInterpolationOpenDelimiter(String delimiterInterpolat...
      method getInterpolationCloseDelimiter (line 344) | public String getInterpolationCloseDelimiter() {
      method setInterpolationCloseDelimiter (line 348) | public void setInterpolationCloseDelimiter(String delimiterInterpola...
      method isEnableNewLineTrimming (line 352) | public boolean isEnableNewLineTrimming() {
      method setEnableNewLineTrimming (line 356) | public Builder setEnableNewLineTrimming(boolean enableNewLineTrimmin...
      method build (line 361) | public Syntax build() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/lexer/TemplateSource.java
  class TemplateSource (line 18) | public class TemplateSource implements CharSequence {
    method TemplateSource (line 59) | public TemplateSource(Reader reader, String filename) throws IOExcepti...
    method copyReaderIntoCharArray (line 68) | private void copyReaderIntoCharArray(Reader reader) throws IOException {
    method append (line 82) | private void append(char[] characters, int amount) {
    method ensureCapacity (line 90) | private void ensureCapacity(int minCapacity) {
    method grow (line 99) | private void grow(int minCapacity) {
    method advance (line 117) | public void advance(int amount) {
    method advanceThroughWhitespace (line 134) | public void advanceThroughWhitespace() {
    method advanceThroughNewline (line 155) | private int advanceThroughNewline(int index) {
    method substring (line 176) | public String substring(int start, int end) {
    method substring (line 180) | public String substring(int end) {
    method length (line 184) | @Override
    method charAt (line 189) | @Override
    method subSequence (line 194) | @Override
    method toString (line 199) | public String toString() {
    method getLineNumber (line 203) | public int getLineNumber() {
    method getFilename (line 207) | public String getFilename() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/lexer/Token.java
  class Token (line 13) | public class Token {
    type Type (line 21) | public enum Type {
    method Token (line 25) | public Token(Type type, String value, int lineNumber) {
    method test (line 31) | public boolean test(Type type) {
    method test (line 35) | public boolean test(Type type, String... values) {
    method getValue (line 43) | public String getValue() {
    method setValue (line 47) | public void setValue(String value) {
    method getType (line 51) | public Type getType() {
    method setType (line 55) | public void setType(Type type) {
    method getLineNumber (line 59) | public int getLineNumber() {
    method setLineNumber (line 63) | public void setLineNumber(int lineNumber) {
    method toString (line 67) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/lexer/TokenStream.java
  class TokenStream (line 16) | public class TokenStream {
    method TokenStream (line 30) | public TokenStream(Collection<Token> tokens, String name) {
    method next (line 41) | public Token next() {
    method expect (line 52) | public Token expect(Token.Type type) {
    method expect (line 64) | public Token expect(Token.Type type, String value) {
    method peek (line 84) | public Token peek() {
    method peek (line 94) | public Token peek(int number) {
    method isEOF (line 98) | public boolean isEOF() {
    method toString (line 102) | @Override
    method current (line 112) | public Token current() {
    method getFilename (line 116) | public String getFilename() {
    method getTokens (line 125) | public ArrayList<Token> getTokens() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/AbstractServletLoader.java
  class AbstractServletLoader (line 22) | public abstract class AbstractServletLoader implements Loader<String> {
    method getResourceAsStream (line 34) | protected abstract InputStream getResourceAsStream(String location);
    method getResource (line 36) | protected abstract URL getResource(String location) throws MalformedUR...
    method getReader (line 38) | @Override
    method getLocation (line 64) | private String getLocation(String templateName) {
    method getSuffix (line 84) | public String getSuffix() {
    method setSuffix (line 88) | @Override
    method getPrefix (line 93) | public String getPrefix() {
    method setPrefix (line 97) | @Override
    method getCharset (line 102) | public String getCharset() {
    method setCharset (line 106) | @Override
    method resolveRelativePath (line 111) | @Override
    method createCacheKey (line 116) | @Override
    method resourceExists (line 121) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/ClasspathLoader.java
  class ClasspathLoader (line 28) | public class ClasspathLoader implements Loader<String> {
    method ClasspathLoader (line 42) | public ClasspathLoader(ClassLoader classLoader) {
    method ClasspathLoader (line 46) | public ClasspathLoader() {
    method getReader (line 50) | @Override
    method getLocation (line 71) | private String getLocation(String templateName) {
    method getSuffix (line 91) | public String getSuffix() {
    method setSuffix (line 95) | @Override
    method getPrefix (line 100) | public String getPrefix() {
    method setPrefix (line 104) | @Override
    method getCharset (line 109) | public String getCharset() {
    method setCharset (line 113) | @Override
    method resolveRelativePath (line 118) | @Override
    method createCacheKey (line 123) | @Override
    method resourceExists (line 128) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/DelegatingLoader.java
  class DelegatingLoader (line 25) | public class DelegatingLoader implements Loader<DelegatingLoaderCacheKey> {
    method DelegatingLoader (line 45) | public DelegatingLoader(List<Loader<?>> loaders) {
    method getReader (line 50) | @Override
    method getReaderInner (line 76) | private <T> Reader getReaderInner(Loader<T> delegatingLoader, Object c...
    method getSuffix (line 86) | public String getSuffix() {
    method setSuffix (line 90) | @Override
    method getPrefix (line 98) | public String getPrefix() {
    method setPrefix (line 102) | @Override
    method getCharset (line 110) | public String getCharset() {
    method setCharset (line 114) | @Override
    method resolveRelativePath (line 122) | @Override
    method createCacheKey (line 136) | @Override
    method resourceExists (line 147) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/DelegatingLoaderCacheKey.java
  class DelegatingLoaderCacheKey (line 16) | public final class DelegatingLoaderCacheKey {
    method DelegatingLoaderCacheKey (line 24) | DelegatingLoaderCacheKey(final List<Object> delegatingCacheKeys, final...
    method getTemplateName (line 30) | public String getTemplateName() {
    method getDelegatingCacheKeys (line 34) | public List<Object> getDelegatingCacheKeys() {
    method caclulateHashCode (line 38) | private int caclulateHashCode() {
    method hashCode (line 46) | @Override
    method equals (line 51) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/FileLoader.java
  class FileLoader (line 26) | public class FileLoader implements Loader<String> {
    method FileLoader (line 34) | public FileLoader(String prefix) {
    method getReader (line 38) | @Override
    method getFile (line 51) | private File getFile(String templateName) {
    method getSuffix (line 62) | public String getSuffix() {
    method setSuffix (line 66) | @Override
    method getPrefix (line 71) | public String getPrefix() {
    method setPrefix (line 75) | @Override
    method getCharset (line 90) | public String getCharset() {
    method setCharset (line 94) | @Override
    method resolveRelativePath (line 99) | @Override
    method createCacheKey (line 104) | @Override
    method resourceExists (line 109) | @Override
    method checkIfDirectoryTraversal (line 114) | private void checkIfDirectoryTraversal(String templateName) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/Loader.java
  type Loader (line 22) | public interface Loader<T> {
    method getReader (line 30) | Reader getReader(T cacheKey);
    method setCharset (line 37) | void setCharset(String charset);
    method setPrefix (line 44) | void setPrefix(String prefix);
    method setSuffix (line 51) | void setSuffix(String suffix);
    method resolveRelativePath (line 64) | String resolveRelativePath(String relativePath, String anchorPath);
    method createCacheKey (line 103) | T createCacheKey(String templateName);
    method resourceExists (line 105) | boolean resourceExists(String templateName);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/MemoryLoader.java
  class MemoryLoader (line 10) | public class MemoryLoader implements Loader<String> {
    method getReader (line 13) | @Override
    method addTemplate (line 30) | public void addTemplate(String templateName, String content) {
    method getTemplates (line 40) | public List<TemplateDefinition> getTemplates() {
    method setSuffix (line 44) | @Override
    method setPrefix (line 48) | @Override
    method setCharset (line 52) | @Override
    method resolveRelativePath (line 56) | @Override
    method createCacheKey (line 61) | @Override
    method resourceExists (line 66) | @Override
    class TemplateDefinition (line 76) | public static class TemplateDefinition {
      method TemplateDefinition (line 80) | public TemplateDefinition(String templateName,

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/Servlet5Loader.java
  class Servlet5Loader (line 14) | public class Servlet5Loader extends AbstractServletLoader {
    method Servlet5Loader (line 18) | public Servlet5Loader(ServletContext context) {
    method getResourceAsStream (line 22) | @Override
    method getResource (line 27) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/ServletLoader.java
  class ServletLoader (line 14) | public class ServletLoader extends AbstractServletLoader {
    method ServletLoader (line 18) | public ServletLoader(ServletContext context) {
    method getResourceAsStream (line 22) | @Override
    method getResource (line 27) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/loader/StringLoader.java
  class StringLoader (line 19) | public class StringLoader implements Loader<String> {
    method getReader (line 21) | @Override
    method setPrefix (line 26) | @Override
    method setSuffix (line 31) | @Override
    method setCharset (line 36) | @Override
    method resolveRelativePath (line 41) | @Override
    method createCacheKey (line 46) | @Override
    method resourceExists (line 51) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/AbstractRenderableNode.java
  class AbstractRenderableNode (line 18) | public abstract class AbstractRenderableNode implements RenderableNode {
    method render (line 22) | @Override
    method accept (line 26) | @Override
    method AbstractRenderableNode (line 29) | public AbstractRenderableNode() {
    method AbstractRenderableNode (line 32) | public AbstractRenderableNode(int lineNumber) {
    method getLineNumber (line 36) | public int getLineNumber() {
    method setLineNumber (line 40) | public void setLineNumber(int lineNumber) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/ArgumentsNode.java
  class ArgumentsNode (line 21) | public class ArgumentsNode implements Node {
    method ArgumentsNode (line 29) | public ArgumentsNode(List<PositionalArgumentNode> positionalArgs,
    method accept (line 37) | @Override
    method getNamedArgs (line 42) | public List<NamedArgumentNode> getNamedArgs() {
    method getPositionalArgs (line 46) | public List<PositionalArgumentNode> getPositionalArgs() {
    method getArgumentMap (line 60) | public Map<String, Object> getArgumentMap(PebbleTemplateImpl self, Eva...
    method toString (line 112) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/AutoEscapeNode.java
  class AutoEscapeNode (line 18) | public class AutoEscapeNode extends AbstractRenderableNode {
    method AutoEscapeNode (line 26) | public AutoEscapeNode(int lineNumber, BodyNode body, boolean active, S...
    method render (line 33) | @Override
    method accept (line 39) | @Override
    method getBody (line 44) | public BodyNode getBody() {
    method getStrategy (line 48) | public String getStrategy() {
    method isActive (line 52) | public boolean isActive() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/BlockNode.java
  class BlockNode (line 19) | public class BlockNode extends AbstractRenderableNode {
    method BlockNode (line 25) | public BlockNode(int lineNumber, String name) {
    method BlockNode (line 29) | public BlockNode(int lineNumber, String name, BodyNode body) {
    method render (line 35) | @Override
    method accept (line 41) | @Override
    method getBlock (line 46) | public Block getBlock() {
    method getBody (line 62) | public BodyNode getBody() {
    method getName (line 66) | public String getName() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/BodyNode.java
  class BodyNode (line 20) | public class BodyNode extends AbstractRenderableNode {
    method BodyNode (line 30) | public BodyNode(int lineNumber, List<RenderableNode> children) {
    method render (line 35) | @Override
    method accept (line 48) | @Override
    method getChildren (line 53) | public List<RenderableNode> getChildren() {
    method isOnlyRenderInheritanceSafeNodes (line 57) | public boolean isOnlyRenderInheritanceSafeNodes() {
    method setOnlyRenderInheritanceSafeNodes (line 61) | public void setOnlyRenderInheritanceSafeNodes(boolean onlyRenderInheri...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/CacheNode.java
  class CacheNode (line 30) | public class CacheNode extends AbstractRenderableNode {
    method CacheNode (line 36) | public CacheNode(int lineNumber, Expression<?> name, BodyNode body) {
    method accept (line 42) | @Override
    method render (line 47) | @Override
    method render (line 68) | private String render(final PebbleTemplateImpl self, final EvaluationC...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/EmbedNode.java
  class EmbedNode (line 24) | public class EmbedNode extends AbstractRenderableNode {
    method EmbedNode (line 32) | public EmbedNode(int lineNumber, Expression<?> includeExpression, MapE...
    method render (line 39) | @Override
    method accept (line 58) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/ExtendsNode.java
  class ExtendsNode (line 18) | public class ExtendsNode extends AbstractRenderableNode {
    method ExtendsNode (line 22) | public ExtendsNode(int lineNumber, Expression<?> parentExpression) {
    method render (line 27) | @Override
    method accept (line 33) | @Override
    method getParentExpression (line 38) | public Expression<?> getParentExpression() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/FlushNode.java
  class FlushNode (line 18) | public class FlushNode extends AbstractRenderableNode {
    method FlushNode (line 20) | public FlushNode(int lineNumber) {
    method render (line 24) | @Override
    method accept (line 30) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/ForNode.java
  class ForNode (line 32) | public class ForNode extends AbstractRenderableNode {
    method ForNode (line 42) | public ForNode(int lineNumber, String variableName, Expression<?> iter...
    class LoopVariables (line 52) | public static class LoopVariables {
      method toString (line 58) | @Override
      method isFirst (line 63) | public boolean isFirst() {
      method isLast (line 67) | public boolean isLast() {
      method getLength (line 71) | public LazyLength getLength() {
      method getIndex (line 75) | public int getIndex() {
      method getRevindex (line 79) | public LazyRevIndex getRevindex() {
    method render (line 84) | @Override
    method accept (line 156) | @Override
    method getIterationVariable (line 161) | public String getIterationVariable() {
    method getIterable (line 165) | public Expression<?> getIterable() {
    method getBody (line 169) | public BodyNode getBody() {
    method getElseBody (line 173) | public BodyNode getElseBody() {
    method toIterable (line 177) | @SuppressWarnings({"unchecked", "rawtypes"})
    class ArrayIterable (line 199) | private class ArrayIterable implements Iterable<Object> {
      method ArrayIterable (line 203) | ArrayIterable(Object array) {
      method iterator (line 207) | @Override
    class EnumerationIterable (line 236) | private class EnumerationIterable implements Iterable<Object> {
      method EnumerationIterable (line 240) | EnumerationIterable(Enumeration<Object> enumeration) {
      method iterator (line 244) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/FromNode.java
  class FromNode (line 19) | public class FromNode extends AbstractRenderableNode {
    method FromNode (line 24) | public FromNode(int lineNumber, Expression<?> fromExpression,
    method render (line 31) | @Override
    method accept (line 37) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/FunctionOrMacroNameNode.java
  class FunctionOrMacroNameNode (line 16) | public class FunctionOrMacroNameNode implements Expression<String> {
    method FunctionOrMacroNameNode (line 22) | public FunctionOrMacroNameNode(String name, int lineNumber) {
    method evaluate (line 27) | @Override
    method accept (line 32) | @Override
    method getName (line 37) | public String getName() {
    method getLineNumber (line 41) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/IfNode.java
  class IfNode (line 25) | public class IfNode extends AbstractRenderableNode {
    method IfNode (line 31) | public IfNode(int lineNumber, List<Pair<Expression<?>, BodyNode>> cond...
    method IfNode (line 35) | public IfNode(int lineNumber, List<Pair<Expression<?>, BodyNode>> cond...
    method render (line 42) | @Override
    method accept (line 92) | @Override
    method getConditionsWithBodies (line 97) | public List<Pair<Expression<?>, BodyNode>> getConditionsWithBodies() {
    method getElseBody (line 101) | public BodyNode getElseBody() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/ImportNode.java
  class ImportNode (line 19) | public class ImportNode extends AbstractRenderableNode {
    method ImportNode (line 24) | public ImportNode(int lineNumber, Expression<?> importExpression, Stri...
    method render (line 30) | @Override
    method accept (line 45) | @Override
    method getImportExpression (line 50) | public Expression<?> getImportExpression() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/IncludeNode.java
  class IncludeNode (line 23) | public class IncludeNode extends AbstractRenderableNode {
    method IncludeNode (line 29) | public IncludeNode(int lineNumber, Expression<?> includeExpression, Ma...
    method render (line 35) | @Override
    method accept (line 54) | @Override
    method getIncludeExpression (line 59) | public Expression<?> getIncludeExpression() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/MacroNode.java
  class MacroNode (line 26) | public class MacroNode extends AbstractRenderableNode {
    method MacroNode (line 34) | public MacroNode(String name, ArgumentsNode args, BodyNode body) {
    method render (line 40) | @Override
    method accept (line 45) | @Override
    method getMacro (line 50) | public Macro getMacro() {
    method getBody (line 106) | public BodyNode getBody() {
    method getArgs (line 110) | public ArgumentsNode getArgs() {
    method getName (line 114) | public String getName() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/NamedArgumentNode.java
  class NamedArgumentNode (line 14) | public class NamedArgumentNode implements Node {
    method NamedArgumentNode (line 20) | public NamedArgumentNode(String name, Expression<?> value) {
    method accept (line 25) | @Override
    method getValueExpression (line 30) | public Expression<?> getValueExpression() {
    method getName (line 34) | public String getName() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/Node.java
  type Node (line 13) | public interface Node {
    method accept (line 15) | void accept(NodeVisitor visitor);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/ParallelNode.java
  class ParallelNode (line 24) | public class ParallelNode extends AbstractRenderableNode {
    method ParallelNode (line 37) | public ParallelNode(int lineNumber, BodyNode body) {
    method render (line 42) | @Override
    method accept (line 82) | @Override
    method getBody (line 87) | public BodyNode getBody() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/PositionalArgumentNode.java
  class PositionalArgumentNode (line 14) | public class PositionalArgumentNode implements Node {
    method PositionalArgumentNode (line 18) | public PositionalArgumentNode(Expression<?> value) {
    method accept (line 22) | @Override
    method getValueExpression (line 27) | public Expression<?> getValueExpression() {
    method toString (line 31) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/PrintNode.java
  class PrintNode (line 24) | public class PrintNode extends AbstractRenderableNode {
    method PrintNode (line 28) | public PrintNode(Expression<?> expression, int lineNumber) {
    method render (line 33) | @Override
    method accept (line 49) | @Override
    method getExpression (line 54) | public Expression<?> getExpression() {
    method setExpression (line 58) | public void setExpression(Expression<?> expression) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/RenderableNode.java
  type RenderableNode (line 17) | public interface RenderableNode extends Node {
    method render (line 19) | void render(PebbleTemplateImpl self, Writer writer, EvaluationContextI...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/RootNode.java
  class RootNode (line 18) | public class RootNode extends AbstractRenderableNode {
    method RootNode (line 22) | public RootNode(BodyNode body) {
    method render (line 27) | @Override
    method accept (line 34) | @Override
    method getBody (line 39) | public BodyNode getBody() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/SetNode.java
  class SetNode (line 18) | public class SetNode extends AbstractRenderableNode {
    method SetNode (line 24) | public SetNode(int lineNumber, String name, Expression<?> value) {
    method render (line 30) | @Override
    method accept (line 35) | @Override
    method getValue (line 40) | public Expression<?> getValue() {
    method getName (line 44) | public String getName() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/TestInvocationExpression.java
  class TestInvocationExpression (line 21) | public class TestInvocationExpression implements Expression<Object> {
    method evaluate (line 29) | @Override
    method TestInvocationExpression (line 34) | public TestInvocationExpression(int lineNumber, String testName, Argum...
    method accept (line 40) | @Override
    method getArgs (line 45) | public ArgumentsNode getArgs() {
    method getTestName (line 49) | public String getTestName() {
    method getLineNumber (line 53) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/TextNode.java
  class TextNode (line 23) | public class TextNode extends AbstractRenderableNode {
    method TextNode (line 31) | public TextNode(String text, int lineNumber) {
    method render (line 39) | @Override
    method accept (line 45) | @Override
    method getData (line 50) | public char[] getData() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/AddExpression.java
  class AddExpression (line 16) | public class AddExpression extends BinaryExpression<Object> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/AndExpression.java
  class AndExpression (line 17) | public class AndExpression extends BinaryExpression<Boolean> {
    method evaluate (line 19) | @SuppressWarnings("unchecked")
    method evaluateExpression (line 31) | private boolean evaluateExpression(PebbleTemplateImpl self, Evaluation...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/ArrayExpression.java
  class ArrayExpression (line 19) | public class ArrayExpression implements Expression<List<?>> {
    method ArrayExpression (line 24) | public ArrayExpression(int lineNumber) {
    method ArrayExpression (line 29) | public ArrayExpression(List<Expression<?>> values, int lineNumber) {
    method accept (line 38) | @Override
    method evaluate (line 43) | @Override
    method getValues (line 54) | public List<Expression<?>> getValues() {
    method getLineNumber (line 58) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/BinaryExpression.java
  class BinaryExpression (line 13) | public abstract class BinaryExpression<T> implements Expression<T> {
    method BinaryExpression (line 17) | public BinaryExpression() {
    method BinaryExpression (line 25) | public BinaryExpression(Expression<?> left, Expression<?> right) {
    method setLeft (line 35) | public void setLeft(Expression<?> left) {
    method setRight (line 39) | public void setRight(Expression<?> right) {
    method getLeftExpression (line 43) | public Expression<?> getLeftExpression() {
    method getRightExpression (line 47) | public Expression<?> getRightExpression() {
    method accept (line 51) | @Override
    method setLineNumber (line 61) | public void setLineNumber(int lineNumber) {
    method getLineNumber (line 65) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/BlockFunctionExpression.java
  class BlockFunctionExpression (line 21) | public class BlockFunctionExpression implements Expression<String> {
    method BlockFunctionExpression (line 27) | public BlockFunctionExpression(ArgumentsNode args, int lineNumber) {
    method evaluate (line 32) | @Override
    method accept (line 45) | @Override
    method getBlockNameExpression (line 50) | public Expression<?> getBlockNameExpression() {
    method getLineNumber (line 54) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/ConcatenateExpression.java
  class ConcatenateExpression (line 11) | public class ConcatenateExpression extends BinaryExpression<Object> {
    method ConcatenateExpression (line 13) | public ConcatenateExpression() {
    method ConcatenateExpression (line 16) | public ConcatenateExpression(Expression<?> left, Expression<?> right) {
    method evaluate (line 20) | @Override
    method toString (line 36) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/ContainsExpression.java
  class ContainsExpression (line 18) | public class ContainsExpression extends BinaryExpression<Boolean> {
    method evaluate (line 20) | @SuppressWarnings({"rawtypes", "unchecked"})
    method arrayContains (line 50) | private static boolean arrayContains(Object input, Object value) {
    method containsObject (line 72) | private static boolean containsObject(Object[] array, Object value) {
    method containsBoolean (line 81) | private static boolean containsBoolean(boolean[] array, Object value) {
    method containsByte (line 93) | private static boolean containsByte(byte[] array, Object value) {
    method containsChar (line 105) | private static boolean containsChar(char[] array, Object value) {
    method containsDouble (line 117) | private static boolean containsDouble(double[] array, Object value) {
    method containsFloat (line 129) | private static boolean containsFloat(float[] array, Object value) {
    method containsInt (line 141) | private static boolean containsInt(int[] array, Object value) {
    method containsLong (line 153) | private static boolean containsLong(long[] array, Object value) {
    method containsShort (line 165) | private static boolean containsShort(short[] array, Object value) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/ContextVariableExpression.java
  class ContextVariableExpression (line 17) | public class ContextVariableExpression implements Expression<Object> {
    method ContextVariableExpression (line 23) | public ContextVariableExpression(String name, int lineNumber) {
    method accept (line 28) | @Override
    method getName (line 33) | public String getName() {
    method evaluate (line 37) | @Override
    method getLineNumber (line 49) | @Override
    method toString (line 54) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/DivideExpression.java
  class DivideExpression (line 16) | public class DivideExpression extends BinaryExpression<Object> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/EqualsExpression.java
  class EqualsExpression (line 16) | public class EqualsExpression extends BinaryExpression<Boolean> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/Expression.java
  type Expression (line 15) | public interface Expression<T> extends Node {
    method evaluate (line 17) | T evaluate(PebbleTemplateImpl self, EvaluationContextImpl context);
    method getLineNumber (line 24) | int getLineNumber();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/FilterExpression.java
  class FilterExpression (line 23) | public class FilterExpression extends BinaryExpression<Object> {
    method FilterExpression (line 30) | public FilterExpression() {
    method evaluate (line 35) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/FilterInvocationExpression.java
  class FilterInvocationExpression (line 21) | public class FilterInvocationExpression implements Expression<Object> {
    method FilterInvocationExpression (line 29) | public FilterInvocationExpression(String filterName, ArgumentsNode arg...
    method evaluate (line 35) | @Override
    method accept (line 41) | public void accept(NodeVisitor visitor) {
    method getArgs (line 45) | public ArgumentsNode getArgs() {
    method getFilterName (line 49) | public String getFilterName() {
    method getLineNumber (line 53) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/FunctionOrMacroInvocationExpression.java
  class FunctionOrMacroInvocationExpression (line 19) | public class FunctionOrMacroInvocationExpression implements Expression<O...
    method FunctionOrMacroInvocationExpression (line 27) | public FunctionOrMacroInvocationExpression(String functionName, Argume...
    method evaluate (line 34) | @Override
    method applyFunction (line 43) | private Object applyFunction(PebbleTemplateImpl self, EvaluationContex...
    method accept (line 49) | @Override
    method getFunctionName (line 54) | public String getFunctionName() {
    method getArguments (line 58) | public ArgumentsNode getArguments() {
    method getLineNumber (line 62) | @Override
    method toString (line 67) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/GetAttributeExpression.java
  class GetAttributeExpression (line 30) | public class GetAttributeExpression implements Expression<Object> {
    method GetAttributeExpression (line 42) | public GetAttributeExpression(Expression<?> node, Expression<?> attrib...
    method GetAttributeExpression (line 48) | public GetAttributeExpression(Expression<?> node, Expression<?> attrib...
    method evaluate (line 59) | @Override
    method getArgumentValues (line 105) | private Object[] getArgumentValues(PebbleTemplateImpl self, Evaluation...
    method accept (line 126) | @Override
    method getNode (line 131) | public Expression<?> getNode() {
    method getAttributeNameExpression (line 135) | public Expression<?> getAttributeNameExpression() {
    method getArgumentsNode (line 139) | public ArgumentsNode getArgumentsNode() {
    method getLineNumber (line 143) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/GreaterThanEqualsExpression.java
  class GreaterThanEqualsExpression (line 16) | public class GreaterThanEqualsExpression extends BinaryExpression<Boolea...
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/GreaterThanExpression.java
  class GreaterThanExpression (line 16) | public class GreaterThanExpression extends BinaryExpression<Boolean> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LessThanEqualsExpression.java
  class LessThanEqualsExpression (line 16) | public class LessThanEqualsExpression extends BinaryExpression<Boolean> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LessThanExpression.java
  class LessThanExpression (line 16) | public class LessThanExpression extends BinaryExpression<Boolean> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralBigDecimalExpression.java
  class LiteralBigDecimalExpression (line 17) | public class LiteralBigDecimalExpression implements Expression<BigDecima...
    method LiteralBigDecimalExpression (line 22) | public LiteralBigDecimalExpression(BigDecimal value, int lineNumber) {
    method accept (line 27) | @Override
    method evaluate (line 32) | @Override
    method getLineNumber (line 37) | @Override
    method getValue (line 42) | public BigDecimal getValue() {
    method toString (line 46) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralBooleanExpression.java
  class LiteralBooleanExpression (line 15) | public class LiteralBooleanExpression implements Expression<Boolean> {
    method LiteralBooleanExpression (line 21) | public LiteralBooleanExpression(Boolean value, int lineNumber) {
    method accept (line 26) | @Override
    method evaluate (line 31) | @Override
    method getLineNumber (line 36) | @Override
    method getValue (line 41) | public Boolean getValue() {
    method toString (line 45) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralDoubleExpression.java
  class LiteralDoubleExpression (line 15) | public class LiteralDoubleExpression implements Expression<Double> {
    method LiteralDoubleExpression (line 21) | public LiteralDoubleExpression(Double value, int lineNumber) {
    method accept (line 26) | @Override
    method evaluate (line 31) | @Override
    method getLineNumber (line 36) | @Override
    method getValue (line 41) | public Double getValue() {
    method toString (line 45) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralIntegerExpression.java
  class LiteralIntegerExpression (line 15) | public class LiteralIntegerExpression implements Expression<Integer> {
    method LiteralIntegerExpression (line 20) | public LiteralIntegerExpression(Integer value, int lineNumber) {
    method accept (line 25) | @Override
    method evaluate (line 30) | @Override
    method getLineNumber (line 35) | @Override
    method getValue (line 40) | public Integer getValue() {
    method toString (line 44) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralLongExpression.java
  class LiteralLongExpression (line 15) | public class LiteralLongExpression implements Expression<Long> {
    method LiteralLongExpression (line 20) | public LiteralLongExpression(Long value, int lineNumber) {
    method accept (line 25) | @Override
    method evaluate (line 30) | @Override
    method getLineNumber (line 35) | @Override
    method getValue (line 40) | public Long getValue() {
    method toString (line 44) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralNullExpression.java
  class LiteralNullExpression (line 15) | public class LiteralNullExpression implements Expression<Object> {
    method LiteralNullExpression (line 19) | public LiteralNullExpression(int lineNumber) {
    method accept (line 23) | @Override
    method evaluate (line 28) | @Override
    method getLineNumber (line 33) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/LiteralStringExpression.java
  class LiteralStringExpression (line 15) | public class LiteralStringExpression implements Expression<String> {
    method LiteralStringExpression (line 21) | public LiteralStringExpression(String value, int lineNumber) {
    method accept (line 26) | @Override
    method evaluate (line 31) | @Override
    method getLineNumber (line 36) | @Override
    method getValue (line 41) | public String getValue() {
    method toString (line 45) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/MapExpression.java
  class MapExpression (line 20) | public class MapExpression implements Expression<Map<?, ?>> {
    method MapExpression (line 26) | public MapExpression(int lineNumber) {
    method MapExpression (line 31) | public MapExpression(Map<Expression<?>, Expression<?>> entries, int li...
    method accept (line 40) | @Override
    method evaluate (line 45) | @Override
    method getEntries (line 60) | public Map<Expression<?>, Expression<?>> getEntries() {
    method getLineNumber (line 64) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/ModulusExpression.java
  class ModulusExpression (line 16) | public class ModulusExpression extends BinaryExpression<Object> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/MultiplyExpression.java
  class MultiplyExpression (line 16) | public class MultiplyExpression extends BinaryExpression<Object> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/NegativeTestExpression.java
  class NegativeTestExpression (line 14) | public class NegativeTestExpression extends PositiveTestExpression {
    method evaluate (line 16) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/NotEqualsExpression.java
  class NotEqualsExpression (line 16) | public class NotEqualsExpression extends BinaryExpression<Boolean> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/OrExpression.java
  class OrExpression (line 17) | public class OrExpression extends BinaryExpression<Boolean> {
    method evaluate (line 19) | @SuppressWarnings("unchecked")
    method evaluateExpression (line 31) | private boolean evaluateExpression(PebbleTemplateImpl self, Evaluation...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/ParentFunctionExpression.java
  class ParentFunctionExpression (line 21) | public class ParentFunctionExpression implements Expression<String> {
    method ParentFunctionExpression (line 27) | public ParentFunctionExpression(String blockName, int lineNumber) {
    method evaluate (line 32) | @Override
    method accept (line 56) | @Override
    method getBlockName (line 61) | public String getBlockName() {
    method getLineNumber (line 65) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/PositiveTestExpression.java
  class PositiveTestExpression (line 22) | public class PositiveTestExpression extends BinaryExpression<Object> {
    method evaluate (line 26) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/RangeExpression.java
  class RangeExpression (line 17) | public class RangeExpression extends BinaryExpression<Object> {
    method evaluate (line 19) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/RenderableNodeExpression.java
  class RenderableNodeExpression (line 27) | public class RenderableNodeExpression extends UnaryExpression {
    method RenderableNodeExpression (line 33) | public RenderableNodeExpression(RenderableNode node, int lineNumber) {
    method evaluate (line 38) | @Override
    method getNode (line 50) | public RenderableNode getNode() {
    method getLineNumber (line 54) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/SubtractExpression.java
  class SubtractExpression (line 16) | public class SubtractExpression extends BinaryExpression<Object> {
    method evaluate (line 18) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/TernaryExpression.java
  class TernaryExpression (line 18) | public class TernaryExpression implements Expression<Object> {
    method TernaryExpression (line 28) | public TernaryExpression(Expression<Boolean> expression1, Expression<?...
    method evaluate (line 36) | @Override
    method accept (line 47) | @Override
    method getExpression1 (line 52) | public Expression<Boolean> getExpression1() {
    method getExpression2 (line 56) | public Expression<?> getExpression2() {
    method getExpression3 (line 60) | public Expression<?> getExpression3() {
    method setExpression3 (line 64) | public void setExpression3(Expression<?> expression3) {
    method setExpression2 (line 68) | public void setExpression2(Expression<?> expression2) {
    method getLineNumber (line 72) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/UnaryExpression.java
  class UnaryExpression (line 13) | public abstract class UnaryExpression implements Expression<Object> {
    method accept (line 19) | @Override
    method getChildExpression (line 24) | public Expression<?> getChildExpression() {
    method setChildExpression (line 28) | public void setChildExpression(Expression<?> childExpression) {
    method setLineNumber (line 38) | public void setLineNumber(int lineNumber) {
    method getLineNumber (line 42) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/UnaryMinusExpression.java
  class UnaryMinusExpression (line 15) | public class UnaryMinusExpression extends UnaryExpression {
    method evaluate (line 17) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/UnaryNotExpression.java
  class UnaryNotExpression (line 18) | public class UnaryNotExpression extends UnaryExpression {
    method evaluate (line 20) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/expression/UnaryPlusExpression.java
  class UnaryPlusExpression (line 15) | public class UnaryPlusExpression extends UnaryExpression {
    method evaluate (line 17) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/fornode/LazyLength.java
  class LazyLength (line 9) | public class LazyLength extends Number {
    method LazyLength (line 14) | public LazyLength(Object iterableEvaluation) {
    method intValue (line 18) | @Override
    method longValue (line 23) | @Override
    method floatValue (line 28) | @Override
    method doubleValue (line 33) | @Override
    method toString (line 38) | @Override
    method getValue (line 43) | private int getValue() {
    method getIteratorSize (line 50) | private int getIteratorSize(Object iterable) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/node/fornode/LazyRevIndex.java
  class LazyRevIndex (line 3) | public class LazyRevIndex extends Number {
    method LazyRevIndex (line 7) | public LazyRevIndex(int value, LazyLength lazyLength) {
    method intValue (line 12) | @Override
    method longValue (line 17) | @Override
    method floatValue (line 22) | @Override
    method doubleValue (line 27) | @Override
    method toString (line 32) | @Override
    method getValue (line 37) | private int getValue() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/operator/Associativity.java
  type Associativity (line 11) | public enum Associativity {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/operator/BinaryOperator.java
  type BinaryOperator (line 13) | public interface BinaryOperator {
    method getPrecedence (line 15) | int getPrecedence();
    method getSymbol (line 17) | String getSymbol();
    method createInstance (line 19) | BinaryExpression<?> createInstance();
    method getType (line 21) | BinaryOperatorType getType();
    method getAssociativity (line 23) | Associativity getAssociativity();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/operator/BinaryOperatorImpl.java
  class BinaryOperatorImpl (line 18) | public class BinaryOperatorImpl implements BinaryOperator {
    method BinaryOperatorImpl (line 33) | public BinaryOperatorImpl(String symbol, int precedence,
    method BinaryOperatorImpl (line 48) | public BinaryOperatorImpl(String symbol, int precedence,
    method getPrecedence (line 59) | @Override
    method getSymbol (line 64) | @Override
    method createInstance (line 69) | @Override
    method getType (line 74) | @Override
    method getAssociativity (line 79) | @Override
    method getDefaultType (line 84) | private static BinaryOperatorType getDefaultType(Class<? extends Binar...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/operator/BinaryOperatorType.java
  type BinaryOperatorType (line 3) | public enum BinaryOperatorType {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/operator/UnaryOperator.java
  type UnaryOperator (line 13) | public interface UnaryOperator {
    method getPrecedence (line 15) | int getPrecedence();
    method getSymbol (line 17) | String getSymbol();
    method getNodeClass (line 19) | Class<? extends UnaryExpression> getNodeClass();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/operator/UnaryOperatorImpl.java
  class UnaryOperatorImpl (line 13) | public class UnaryOperatorImpl implements UnaryOperator {
    method UnaryOperatorImpl (line 21) | public UnaryOperatorImpl(String symbol, int precedence,
    method getPrecedence (line 28) | @Override
    method getSymbol (line 33) | @Override
    method getNodeClass (line 38) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/parser/ExpressionParser.java
  class ExpressionParser (line 56) | public class ExpressionParser {
    method ExpressionParser (line 78) | public ExpressionParser(Parser parser, Map<String, BinaryOperator> bin...
    method parseExpression (line 91) | public Expression<?> parseExpression() {
    method parseExpression (line 102) | private Expression<?> parseExpression(int minPrecedence) {
    method isUnary (line 235) | private boolean isUnary(Token token) {
    method isBinary (line 245) | private boolean isBinary(Token token) {
    method subparseExpression (line 256) | private Expression<?> subparseExpression() {
    method parseStringExpression (line 342) | private Expression<?> parseStringExpression() throws ParserException {
    method parseTernaryExpression (line 384) | @SuppressWarnings("unchecked")
    method parsePostfixExpression (line 412) | private Expression<?> parsePostfixExpression(Expression<?> node) {
    method parseFunctionOrMacroInvocation (line 435) | private Expression<?> parseFunctionOrMacroInvocation(Expression<?> nod...
    method parseFilterInvocationExpression (line 454) | public FilterInvocationExpression parseFilterInvocationExpression() {
    method parseTestInvocationExpression (line 469) | private Expression<?> parseTestInvocationExpression() {
    method parseBeanAttributeExpression (line 494) | private Expression<?> parseBeanAttributeExpression(Expression<?> node) {
    method parseArguments (line 533) | private ArgumentsNode parseArguments() {
    method parseArguments (line 537) | public ArgumentsNode parseArguments(boolean isMacroDefinition) {
    method parseNewVariableName (line 600) | public String parseNewVariableName() {
    method parseArrayDefinitionExpression (line 616) | private Expression<?> parseArrayDefinitionExpression() {
    method parseMapDefinitionExpression (line 646) | private Expression<?> parseMapDefinitionExpression() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/parser/Parser.java
  type Parser (line 15) | public interface Parser {
    method parse (line 17) | RootNode parse(TokenStream stream);
    method subparse (line 19) | BodyNode subparse();
    method getStream (line 26) | TokenStream getStream();
    method subparse (line 35) | BodyNode subparse(StoppingCondition stopCondition);
    method getExpressionParser (line 37) | ExpressionParser getExpressionParser();
    method peekBlockStack (line 39) | String peekBlockStack();
    method popBlockStack (line 41) | String popBlockStack();
    method pushBlockStack (line 43) | void pushBlockStack(String blockName);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/parser/ParserImpl.java
  class ParserImpl (line 29) | public class ParserImpl implements Parser {
    method ParserImpl (line 78) | public ParserImpl(Map<String, UnaryOperator> unaryOperators,
    method parse (line 87) | @Override
    method subparse (line 103) | @Override
    method subparse (line 108) | @Override
    method getStream (line 216) | @Override
    method setStream (line 221) | public void setStream(TokenStream stream) {
    method getExpressionParser (line 225) | @Override
    method peekBlockStack (line 230) | @Override
    method popBlockStack (line 235) | @Override
    method pushBlockStack (line 240) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/parser/ParserOptions.java
  class ParserOptions (line 8) | public class ParserOptions {
    method isLiteralDecimalTreatedAsInteger (line 14) | public boolean isLiteralDecimalTreatedAsInteger() {
    method setLiteralDecimalTreatedAsInteger (line 18) | public ParserOptions setLiteralDecimalTreatedAsInteger(boolean literal...
    method isLiteralNumbersAsBigDecimals (line 23) | public boolean isLiteralNumbersAsBigDecimals() {
    method setLiteralNumbersAsBigDecimals (line 27) | public ParserOptions setLiteralNumbersAsBigDecimals(boolean literalNum...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/parser/StoppingCondition.java
  type StoppingCondition (line 20) | public interface StoppingCondition {
    method evaluate (line 22) | boolean evaluate(Token data);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/Block.java
  type Block (line 14) | public interface Block {
    method getName (line 16) | String getName();
    method evaluate (line 18) | void evaluate(PebbleTemplateImpl self, Writer writer, EvaluationContex...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/EvaluationContext.java
  type EvaluationContext (line 8) | public interface EvaluationContext {
    method isStrictVariables (line 10) | boolean isStrictVariables();
    method getLocale (line 12) | Locale getLocale();
    method getVariable (line 14) | Object getVariable(String key);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/EvaluationContextImpl.java
  class EvaluationContextImpl (line 32) | public class EvaluationContextImpl implements EvaluationContext, Rendere...
    method EvaluationContextImpl (line 110) | public EvaluationContextImpl(PebbleTemplateImpl self, boolean strictVa...
    method shallowCopyWithoutInheritanceChain (line 140) | public EvaluationContextImpl shallowCopyWithoutInheritanceChain(Pebble...
    method threadSafeCopy (line 155) | public EvaluationContextImpl threadSafeCopy(PebbleTemplateImpl self) {
    method getNamedImportedTemplate (line 169) | public PebbleTemplateImpl getNamedImportedTemplate(String alias) {
    method addNamedImportedTemplates (line 173) | public void addNamedImportedTemplates(String alias, PebbleTemplateImpl...
    method isStrictVariables (line 186) | @Override
    method getLocale (line 196) | @Override
    method getMaxRenderedSize (line 205) | @Override
    method getExtensionRegistry (line 215) | public ExtensionRegistry getExtensionRegistry() {
    method getExecutorService (line 224) | public ExecutorService getExecutorService() {
    method getImportedTemplates (line 233) | public List<PebbleTemplateImpl> getImportedTemplates() {
    method getTagCache (line 242) | public PebbleCache<CacheKey, Object> getTagCache() {
    method getScopeChain (line 252) | public ScopeChain getScopeChain() {
    method getHierarchy (line 262) | public Hierarchy getHierarchy() {
    method getEvaluationOptions (line 271) | public EvaluationOptions getEvaluationOptions() {
    method getVariable (line 275) | @Override
    method pushScope (line 280) | private void pushScope(
    method scopedShallowWithoutInheritanceChain (line 304) | public void scopedShallowWithoutInheritanceChain(
    method addAndGet (line 315) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/EvaluationOptions.java
  class EvaluationOptions (line 10) | public class EvaluationOptions {
    method EvaluationOptions (line 22) | public EvaluationOptions(boolean greedyMatchMethod,
    method isGreedyMatchMethod (line 28) | public boolean isGreedyMatchMethod() {
    method getMethodAccessValidator (line 32) | public MethodAccessValidator getMethodAccessValidator() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/GlobalContext.java
  class GlobalContext (line 8) | public class GlobalContext implements Map<String, Object> {
    method GlobalContext (line 12) | public GlobalContext(ScopeChain scopeChain) {
    method get (line 16) | @Override
    method isEmpty (line 32) | @Override
    method size (line 37) | @Override
    method containsKey (line 42) | @Override
    method containsValue (line 47) | @Override
    method put (line 52) | @Override
    method remove (line 57) | @Override
    method putAll (line 62) | @Override
    method clear (line 67) | @Override
    method keySet (line 72) | @Override
    method values (line 77) | @Override
    method entrySet (line 82) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/Hierarchy.java
  class Hierarchy (line 17) | public class Hierarchy {
    method Hierarchy (line 35) | public Hierarchy(PebbleTemplateImpl currentTemplate) {
    method pushAncestor (line 45) | public void pushAncestor(PebbleTemplateImpl ancestor) {
    method ascend (line 53) | public void ascend() {
    method descend (line 61) | public void descend() {
    method getChild (line 70) | public PebbleTemplateImpl getChild() {
    method getParent (line 82) | public PebbleTemplateImpl getParent() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/Macro.java
  type Macro (line 14) | public interface Macro extends NamedArguments {
    method getName (line 16) | String getName();
    method call (line 18) | String call(PebbleTemplateImpl self, EvaluationContextImpl context, Ma...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/MacroAttributeProvider.java
  class MacroAttributeProvider (line 6) | public class MacroAttributeProvider {
    method MacroAttributeProvider (line 10) | public MacroAttributeProvider(PebbleTemplateImpl template) {
    method macro (line 23) | public Object macro(EvaluationContextImpl context, String macroName, A...

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/PebbleTemplate.java
  type PebbleTemplate (line 24) | public interface PebbleTemplate {
    method evaluate (line 33) | void evaluate(Writer writer) throws IOException;
    method evaluate (line 42) | void evaluate(Writer writer, Locale locale) throws IOException;
    method evaluate (line 52) | void evaluate(Writer writer, Map<String, Object> context) throws IOExc...
    method evaluate (line 62) | void evaluate(Writer writer, Map<String, Object> context, Locale local...
    method evaluateBlock (line 71) | void evaluateBlock(String blockName, Writer writer) throws IOException;
    method evaluateBlock (line 81) | void evaluateBlock(String blockName, Writer writer, Locale locale) thr...
    method evaluateBlock (line 91) | void evaluateBlock(String blockName, Writer writer, Map<String, Object...
    method evaluateBlock (line 103) | void evaluateBlock(String blockName, Writer writer, Map<String, Object...
    method getName (line 111) | String getName();
    method getRootNode (line 117) | RenderableNode getRootNode();

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/PebbleTemplateImpl.java
  class PebbleTemplateImpl (line 36) | public class PebbleTemplateImpl implements PebbleTemplate {
    method PebbleTemplateImpl (line 74) | public PebbleTemplateImpl(PebbleEngine engine, RenderableNode root, St...
    method evaluate (line 80) | public void evaluate(Writer writer) throws IOException {
    method evaluate (line 85) | public void evaluate(Writer writer, Locale locale) throws IOException {
    method evaluate (line 90) | public void evaluate(Writer writer, Map<String, Object> map) throws IO...
    method evaluate (line 99) | public void evaluate(Writer writer, Map<String, Object> map, Locale lo...
    method evaluateBlock (line 108) | public void evaluateBlock(String blockName, Writer writer) throws IOEx...
    method evaluateBlock (line 116) | public void evaluateBlock(String blockName, Writer writer, Locale loca...
    method evaluateBlock (line 124) | public void evaluateBlock(String blockName, Writer writer, Map<String,...
    method evaluateBlock (line 134) | public void evaluateBlock(String blockName, Writer writer, Map<String,...
    method evaluate (line 152) | private void evaluate(Writer writer, EvaluationContextImpl context) th...
    method initContext (line 179) | private EvaluationContextImpl initContext(Locale locale) {
    method shallowCopy (line 205) | private PebbleTemplateImpl shallowCopy() {
    method importTemplate (line 219) | public void importTemplate(EvaluationContextImpl context, String name) {
    method importNamedTemplate (line 231) | public void importNamedTemplate(EvaluationContextImpl context, String ...
    method importNamedMacrosFromTemplate (line 242) | public void importNamedMacrosFromTemplate(String name, List<Pair<Strin...
    method getNamedImportedTemplate (line 263) | public PebbleTemplateImpl getNamedImportedTemplate(EvaluationContextIm...
    method includeTemplate (line 277) | public void includeTemplate(Writer writer, EvaluationContextImpl conte...
    method embedTemplate (line 305) | public void embedTemplate(
    method hasMacro (line 359) | public boolean hasMacro(String macroName) {
    method hasBlock (line 369) | public boolean hasBlock(String blockName) {
    method resolveRelativePath (line 379) | public String resolveRelativePath(String relativePath) {
    method registerBlock (line 393) | public void registerBlock(Block block) {
    method registerMacro (line 402) | public void registerMacro(Macro macro) {
    method registerMacro (line 416) | public void registerMacro(String alias, Macro macro) {
    method block (line 433) | public void block(Writer writer, EvaluationContextImpl context, String...
    method macro (line 471) | public SafeString macro(EvaluationContextImpl context, String macroNam...
    method setParent (line 523) | public void setParent(EvaluationContextImpl context, String parentName) {
    method getName (line 534) | public String getName() {
    method getRootNode (line 543) | public RenderableNode getRootNode() { return this.rootNode; }
    class NoopWriter (line 545) | private static class NoopWriter extends Writer {
      method write (line 547) | public void write(char[] cbuf, int off, int len) {
      method flush (line 550) | public void flush() {
      method close (line 553) | public void close() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/RenderedSizeContext.java
  type RenderedSizeContext (line 3) | public interface RenderedSizeContext {
    method getMaxRenderedSize (line 4) | int getMaxRenderedSize();
    method addAndGet (line 6) | int addAndGet(int delta);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/Scope.java
  class Scope (line 21) | public class Scope {
    method Scope (line 40) | public Scope(Map<String, Object> backingMap, boolean local) {
    method shallowCopy (line 57) | public Scope shallowCopy() {
    method put (line 68) | public void put(String key, Object value) {
    method get (line 78) | public Object get(String key) {
    method containsKey (line 88) | public boolean containsKey(String key) {
    method isLocal (line 97) | public boolean isLocal() {
    method getKeys (line 106) | public Set<String> getKeys(){

FILE: pebble/src/main/java/io/pebbletemplates/pebble/template/ScopeChain.java
  class ScopeChain (line 24) | public class ScopeChain {
    method ScopeChain (line 34) | public ScopeChain() {
    method deepCopy (line 48) | public ScopeChain deepCopy() {
    method pushScope (line 60) | public void pushScope() {
    method pushScope (line 69) | public void pushScope(Map<String, Object> map) {
    method pushLocalScope (line 77) | public void pushLocalScope() {
    method popScope (line 85) | public void popScope() {
    method put (line 95) | public void put(String key, Object value) {
    method get (line 106) | public Object get(String key) {
    method containsKey (line 150) | public boolean containsKey(String key) {
    method currentScopeContainsVariable (line 190) | public boolean currentScopeContainsVariable(String variableName) {
    method set (line 201) | public void set(String key, Object value) {
    method getGlobalScopes (line 231) | public List<Scope> getGlobalScopes() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/AutoEscapeTokenParser.java
  class AutoEscapeTokenParser (line 18) | public class AutoEscapeTokenParser implements TokenParser {
    method parse (line 20) | @Override
    method getTag (line 56) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/BlockTokenParser.java
  class BlockTokenParser (line 19) | public class BlockTokenParser implements TokenParser {
    method parse (line 21) | @Override
    method getTag (line 73) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/CacheTokenParser.java
  class CacheTokenParser (line 24) | public class CacheTokenParser implements TokenParser {
    method getTag (line 28) | @Override
    method parse (line 33) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/EmbedTokenParser.java
  class EmbedTokenParser (line 24) | public class EmbedTokenParser implements TokenParser {
    method parse (line 28) | @Override
    method parseBlocks (line 65) | private List<BlockNode> parseBlocks(Token token, Parser parser, TokenS...
    method parseBlock (line 79) | private BlockNode parseBlock(Token token, Parser parser, TokenStream s...
    method getTag (line 101) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/ExtendsTokenParser.java
  class ExtendsTokenParser (line 18) | public class ExtendsTokenParser implements TokenParser {
    method parse (line 20) | @Override
    method getTag (line 34) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/FilterTokenParser.java
  class FilterTokenParser (line 27) | public class FilterTokenParser implements TokenParser {
    method parse (line 29) | @Override
    method getTag (line 70) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/FlushTokenParser.java
  class FlushTokenParser (line 17) | public class FlushTokenParser implements TokenParser {
    method parse (line 19) | @Override
    method getTag (line 33) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/ForTokenParser.java
  class ForTokenParser (line 20) | public class ForTokenParser implements TokenParser {
    method parse (line 22) | @Override
    method getTag (line 64) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/FromTokenParser.java
  class FromTokenParser (line 24) | public class FromTokenParser implements TokenParser {
    method parse (line 26) | @Override
    method parseNamedMacros (line 46) | private List<Pair<String, String>> parseNamedMacros(Parser parser) {
    method getTag (line 84) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/IfTokenParser.java
  class IfTokenParser (line 25) | public class IfTokenParser implements TokenParser {
    method parse (line 27) | @Override
    method getTag (line 89) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/ImportTokenParser.java
  class ImportTokenParser (line 18) | public class ImportTokenParser implements TokenParser {
    method parse (line 20) | @Override
    method getTag (line 49) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/IncludeTokenParser.java
  class IncludeTokenParser (line 20) | public class IncludeTokenParser implements TokenParser {
    method parse (line 22) | @Override
    method getTag (line 59) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/MacroTokenParser.java
  class MacroTokenParser (line 19) | public class MacroTokenParser implements TokenParser {
    method parse (line 21) | @Override
    method getTag (line 46) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/ParallelTokenParser.java
  class ParallelTokenParser (line 18) | public class ParallelTokenParser implements TokenParser {
    method parse (line 20) | @Override
    method getTag (line 39) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/SetTokenParser.java
  class SetTokenParser (line 18) | public class SetTokenParser implements TokenParser {
    method parse (line 20) | @Override
    method getTag (line 39) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/TokenParser.java
  type TokenParser (line 21) | public interface TokenParser {
    method getTag (line 29) | String getTag();
    method parse (line 56) | RenderableNode parse(Token token, Parser parser);

FILE: pebble/src/main/java/io/pebbletemplates/pebble/tokenParser/VerbatimTokenParser.java
  class VerbatimTokenParser (line 21) | public class VerbatimTokenParser implements TokenParser {
    method parse (line 23) | @Override
    method getTag (line 29) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/Callbacks.java
  class Callbacks (line 5) | public class Callbacks {
    type PebbleConsumer (line 7) | public interface PebbleConsumer<T> {
      method accept (line 8) | void accept(T t) throws IOException;

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/FutureWriter.java
  class FutureWriter (line 28) | public class FutureWriter extends Writer {
    method FutureWriter (line 36) | public FutureWriter(Writer writer) {
    method enqueue (line 40) | public void enqueue(Future<String> future) throws IOException {
    method write (line 47) | @Override
    method flush (line 92) | @Override
    method close (line 108) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/LimitedSizeWriter.java
  class LimitedSizeWriter (line 26) | public class LimitedSizeWriter extends Writer {
    method from (line 32) | public static Writer from(Writer internalWriter, RenderedSizeContext c...
    method LimitedSizeWriter (line 40) | private LimitedSizeWriter(Writer internalWriter, RenderedSizeContext c...
    method write (line 48) | @Override
    method flush (line 56) | @Override
    method close (line 61) | @Override
    method toString (line 66) | @Override
    method willExceedMaxChars (line 78) | private boolean willExceedMaxChars(int charsToWrite) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/OperatorUtils.java
  class OperatorUtils (line 28) | public class OperatorUtils {
    type Operation (line 30) | private enum Operation {
    type Comparison (line 34) | private enum Comparison {
    method add (line 38) | public static Object add(Object op1, Object op2) {
    method subtract (line 49) | public static Object subtract(Object op1, Object op2) {
    method multiply (line 56) | public static Object multiply(Object op1, Object op2) {
    method divide (line 60) | public static Object divide(Object op1, Object op2) {
    method mod (line 64) | public static Object mod(Object op1, Object op2) {
    method equals (line 68) | public static boolean equals(Object op1, Object op2) {
    method compareEnum (line 80) | private static <T extends Enum<T>> boolean compareEnum(Enum<T> enumVar...
    method gt (line 85) | public static boolean gt(Object op1, Object op2) {
    method gte (line 89) | public static boolean gte(Object op1, Object op2) {
    method lt (line 93) | public static boolean lt(Object op1, Object op2) {
    method lte (line 97) | public static boolean lte(Object op1, Object op2) {
    method unaryPlus (line 101) | public static Object unaryPlus(Object op1) {
    method unaryMinus (line 105) | public static Object unaryMinus(Object op1) {
    method concatenateStrings (line 109) | private static Object concatenateStrings(String op1, String op2) {
    method addToList (line 117) | @Deprecated
    method subtractFromList (line 132) | @Deprecated
    method wideningConversionBinaryOperation (line 143) | private static Object wideningConversionBinaryOperation(Object op1, Ob...
    method wideningConversionBinaryComparison (line 170) | private static boolean wideningConversionBinaryComparison(Object op1, ...
    method doubleOperation (line 190) | private static double doubleOperation(double op1, double op2, Operatio...
    method doubleComparison (line 207) | private static boolean doubleComparison(double op1, double op2, Compar...
    method bigDecimalOperation (line 224) | private static BigDecimal bigDecimalOperation(BigDecimal op1, BigDecim...
    method floatOperation (line 242) | private static Float floatOperation(Float op1, Float op2, Operation op...
    method longOperation (line 259) | private static long longOperation(long op1, long op2, Operation operat...
    method integerOperation (line 276) | private static long integerOperation(int op1, int op2, Operation opera...
    method toNumber (line 293) | static Number toNumber(Object obj) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/Pair.java
  class Pair (line 16) | public class Pair<L, R> {
    method Pair (line 22) | public Pair(L left, R right) {
    method getLeft (line 27) | public L getLeft() {
    method getRight (line 31) | public R getRight() {
    method toString (line 35) | @Override

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/PathUtils.java
  class PathUtils (line 16) | public final class PathUtils {
    method resolveRelativePath (line 29) | public static String resolveRelativePath(String relativePath, String a...
    method sanitize (line 47) | public static String sanitize(String path, char expectedSeparator) {
    method resolvePathInner (line 52) | private static String resolvePathInner(String relativePath, String anc...
    method determineAnchorPathSegments (line 64) | private static Collection<String> determineAnchorPathSegments(String a...
    method resolvePathSegments (line 76) | private static Collection<String> resolvePathSegments(Collection<Strin...
    method splitBySeparator (line 92) | private static List<String> splitBySeparator(String path, char separat...
    method PathUtils (line 96) | private PathUtils() {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/StringLengthComparator.java
  class StringLengthComparator (line 11) | public class StringLengthComparator implements java.util.Comparator<Stri...
    method StringLengthComparator (line 15) | private StringLengthComparator() {
    method compare (line 18) | public int compare(String s1, String s2) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/StringUtils.java
  class StringUtils (line 5) | public class StringUtils {
    method ltrim (line 7) | public static String ltrim(String input) {
    method rtrim (line 15) | public static String rtrim(String input) {
    method toString (line 27) | public static String toString(Object var) {

FILE: pebble/src/main/java/io/pebbletemplates/pebble/utils/TypeUtils.java
  class TypeUtils (line 12) | public class TypeUtils {
    method compatibleCast (line 14) | public static Object[] compatibleCast(Object[] argumentValues, Class<?...
    method compatibleCast (line 27) | @SuppressWarnings("unchecked")

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ArgumentsNodeTest.java
  class ArgumentsNodeTest (line 19) | class ArgumentsNodeTest {
    method testInvalidArgument (line 24) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ArraySyntaxTest.java
  class ArraySyntaxTest (line 28) | class ArraySyntaxTest {
    method testArraySyntax (line 30) | @Test
    method testSimpleArray (line 43) | @Test
    method test2ElementArray (line 56) | @Test
    method test2ElementArray2 (line 69) | @Test
    method testNElementArray (line 82) | @Test
    method testIncompleteArraySyntax (line 101) | @Test
    method testArrayWithExpressions (line 114) | @SuppressWarnings("serial")
    method testArrayWithComplexExpressions (line 137) | @SuppressWarnings({"serial", "unused"})
    method testSetCommand (line 171) | @Test
    method testSetCommand2 (line 184) | @Test
    method testFirstFilter (line 197) | @Test
    method testFirstFilter2 (line 211) | @Test
    method testJoinFilter (line 225) | @Test
    method testJoinFilter2 (line 239) | @Test
    method testLastFilter (line 253) | @Test
    method testLastFilter2 (line 267) | @Test
    method testSliceFilter (line 281) | @Test
    method testSliceFilter2 (line 295) | @Test
    method testSortFilter (line 309) | @Test
    method testSortFilter2 (line 323) | @Test
    method testSortFilterFromArray (line 337) | @Test
    method testForTag (line 351) | @Test
    method testForTag2 (line 365) | @Test
    method testForTagInvalidIterable (line 379) | @Test
    method testForElseTag (line 397) | @Test
    method testIfTag (line 411) | @Test
    method testIfTag2 (line 425) | @Test
    method testMacroTag (line 439) | @Test
    method testMacroTagNamedArguments (line 453) | @Test
    method testAdditionOverloading (line 467) | @Test
    method testAdditionOverloading2 (line 481) | @Test
    method testAdditionOverloading3 (line 495) | @Test
    method testSubtractionOverloading (line 514) | @Test
    method testSubtractionOverloading2 (line 528) | @Test
    method testSubtractionOverloading3 (line 542) | @Test
    method testEmptyTest (line 561) | @Test
    method testEmptyTest2 (line 575) | @Test
    method testEmptyTest3 (line 589) | @Test
    method testIterableTest (line 603) | @Test
    method testIterableTest2 (line 617) | @Test
    method testContainsOperator (line 631) | @Test
    method testContainsOperator2 (line 645) | @Test
    method testContainsOperator3 (line 659) | @Test
    method testContainsOperator4 (line 673) | @Test
    method testContainsOperator5 (line 687) | @Test
    method testNestedArrays (line 701) | @Test
    method testNestedArrays2 (line 715) | @Test
    method testNestedArrays3 (line 729) | @Test
    method testNestedMapInArray (line 743) | @Test
    method testProblematicSubscriptSyntax (line 759) | @SuppressWarnings("serial")
    method testProblematicSubscriptSyntax2 (line 782) | @SuppressWarnings("serial")
    method testProblematicSubscriptSyntax3 (line 805) | @SuppressWarnings({"serial", "unused"})
    method testProblematicSubscriptSyntax4 (line 835) | @SuppressWarnings("serial")
    method testProblematicSubscriptSyntax5 (line 858) | @SuppressWarnings("serial")

FILE: pebble/src/test/java/io/pebbletemplates/pebble/AttributeSubscriptSyntaxTest.java
  class AttributeSubscriptSyntaxTest (line 25) | class AttributeSubscriptSyntaxTest {
    method testAccessingValueWithSubscript (line 27) | @SuppressWarnings("serial")
    method testAccessingValueWithExpressionSubscript (line 49) | @SuppressWarnings("serial")
    method testAccessingValueWithIntegerExpressionSubscript (line 79) | @SuppressWarnings("serial")
    method testAccessingNestedValuesWithSubscript (line 112) | @SuppressWarnings("serial")
    method testMixAndMatchingAttributeSyntax (line 139) | @SuppressWarnings("serial")

FILE: pebble/src/test/java/io/pebbletemplates/pebble/CacheTest.java
  class CacheTest (line 31) | class CacheTest {
    method templatesWithSameNameOverridingCache (line 39) | @Test
    method ensureChildTemplateNotCached (line 63) | @Test
    method templateCachedButBytecodeCleared (line 91) | @Test
    method testConcurrentCacheHitting (line 115) | @Test
    class TestObject (line 172) | public static class TestObject {
      method TestObject (line 178) | private TestObject(int a, int b, int c) {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/CompilerTest.java
  class CompilerTest (line 26) | class CompilerTest {
    method testCompile (line 28) | @Test
    method testCompilationMutexIsAlwaysReleased (line 45) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ConcurrencyTest.java
  class ConcurrencyTest (line 36) | class ConcurrencyTest {
    class TestObject (line 40) | public static class TestObject {
      method TestObject (line 50) | private TestObject(int a, int b, int c, String d) {
    method testConcurrentEvaluation (line 58) | @Test
    method testThreadSafeCompilationOfMultipleTemplates (line 122) | @Test
    method testConcurrentEvaluationWithDifferingLocals (line 213) | @Test
    method testConcurrentEvaluationWithImportingMacros (line 271) | @Test
    method testConcurrentEvaluationWithException (line 359) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ContextTest.java
  class ContextTest (line 33) | class ContextTest {
    method testLazyMap (line 35) | @SuppressWarnings("serial")
    method testMissingContextVariableWithoutStrictVariables (line 68) | @Test
    method testMissingContextVariableWithStrictVariables (line 80) | @Test
    method testExistingButNullContextVariableWithStrictVariables (line 92) | @Test
    method testDefaultLocale (line 108) | @Test
    method testLocaleProvidedDuringEvaluation (line 120) | @Test
    method testGlobalTemplateName (line 132) | @Test
    method testImmutableMapThrows (line 143) | @Test
    method testImmutableContext (line 154) | @Test
    class ImmutableMap (line 174) | private static class ImmutableMap<T, U> implements Map<T, U> {
      method ImmutableMap (line 178) | private ImmutableMap(Map<T, U> delegate) {
      method size (line 182) | @Override
      method isEmpty (line 187) | @Override
      method containsKey (line 192) | @Override
      method containsValue (line 197) | @Override
      method get (line 202) | @Override
      method put (line 207) | @Override
      method remove (line 212) | @Override
      method putAll (line 217) | @Override
      method clear (line 222) | @Override
      method keySet (line 227) | @Override
      method values (line 232) | @Override
      method entrySet (line 237) | @Override
      method equals (line 242) | @Override
      method hashCode (line 247) | @Override
      method getOrDefault (line 252) | @Override
      method forEach (line 257) | @Override
      method replaceAll (line 262) | @Override
      method putIfAbsent (line 267) | @Override
      method remove (line 272) | @Override
      method replace (line 277) | @Override
      method replace (line 282) | @Override
      method computeIfAbsent (line 287) | @Override
      method computeIfPresent (line 292) | @Override
      method compute (line 297) | @Override
      method merge (line 302) | @Override

FILE: pebble/src/test/java/io/pebbletemplates/pebble/CoreFiltersTest.java
  class CoreFiltersTest (line 31) | class CoreFiltersTest {
    method testAbs (line 33) | @Test
    method testAbsDouble (line 45) | @Test
    method testChainedFiltersWithNullInput (line 57) | @Test
    method testLower (line 68) | @Test
    method testLowerWithNullInput (line 80) | @Test
    method testUpper (line 92) | @Test
    method testUpperWithNullInput (line 103) | @Test
    method testDate (line 114) | @Test
    method testStringDateWithOnlyFormat (line 135) | @Test
    method testStringDateWithoutFormat (line 152) | @Test
    method testStringDateWithoutFormatAndNotISO_DATE (line 169) | @Test
    method testDateJava8 (line 186) | @Test
    method testDateWithNamedArguments (line 223) | @Test
    method testDateWithNullInput (line 242) | @Test
    method testDateWithNumberInput (line 256) | @Test
    method testDateWithDateAndExplicitTimeZone (line 272) | @Test
    method testDateWithDateAndFormatAndExplicitTimeZone (line 288) | @Test
    method testDateWithTimestampAndExplicitTimeZone (line 304) | @Test
    method testDateWithOffsetDateTimeAndExplicitTimeZoneUsesTimeZoneOfInput (line 320) | @Test
    method testDateWithOffsetDateTimeAndFormatAndExplicitTimeZoneUsesTimeZoneOfInput (line 336) | @Test
    method testDateWithOffsetDateTimeAndFormatAndNoExplicitTimeZoneUsesTimeZoneOfInput (line 352) | @Test
    method testDateWithInstantAndExplicitTimeZone (line 368) | @Test
    method testDateWithInstantAndNoExplicitTimeZoneUsesSystemTimeZone (line 384) | @Test
    method testDateWithUnsupportedInput (line 408) | @Test
    method testUrlEncode (line 425) | @Test
    method testUrlEncodeWithNullInput (line 436) | @Test
    method testNumberFormatFilterWithFormat (line 447) | @Test
    method testNumberFormatFilterWithNamedArgument (line 463) | @Test
    method testNumberFormatFilterWithNullInput (line 479) | @Test
    method testNumberFormatFilterWithLocale (line 491) | @Test
    method testAbbreviate (line 504) | @Test
    method testAbbreviateWithNamedArguments (line 517) | @Test
    method testAbbreviateWithNullInput (line 530) | @Test
    method testAbbreviateWithSmallLength (line 542) | @Test
    method testCapitalize (line 554) | @Test
    method testCapitalizeWithLeadingWhitespace (line 567) | @Test
    method testCapitalizeWithNullInput (line 580) | @Test
    method testCapitalizeWithEmptyString (line 592) | @Test
    method testSortFilter (line 604) | @Test
    method testRsortFilter (line 626) | @Test
    method testReverseFilter (line 648) | @Test
    method testTitle (line 667) | @Test
    method testTitleWithLeadingWhitespace (line 680) | @Test
    method testTrim (line 692) | @Test
    method testTrimWithNullInput (line 705) | @Test
    method testDefault (line 717) | @Test
    method testDefaultFilterWithStrictMode (line 738) | @Test
    method testDefaultWithNamedArguments (line 754) | @Test
    method testFirst (line 768) | @Test
    method testFirstWithNullInput (line 788) | @Test
    method testFirstWithStringInput (line 803) | @Test
    method testFirstWithEmptyCollection (line 818) | @Test
    method testJoin (line 833) | @Test
    method testJoinWithoutGlue (line 853) | @Test
    method testJoinWithNumbers (line 873) | @Test
    method testJoinWithNullInput (line 893) | @Test
    method testJoinWithStringArray (line 905) | @Test
    method testJoinWithStringArrayWithoutGlue (line 922) | @Test
    method testJoinWithNumbersArray (line 939) | @Test
    method testJoinWithEmptyNumbersArray (line 956) | @Test
    method testJoinWithFloatArray (line 973) | @Test
    method testLast (line 990) | @Test
    method testLastWithNullInput (line 1010) | @Test
    method testLastWithStringInput (line 1022) | @Test
    method testLastWithArrayInput (line 1037) | @Test
    method testLastWithPrimitiveArrayInput (line 1052) | @Test
    method testFirstWithArrayInput (line 1067) | @Test
    method testFirstWithPrimitiveArrayInput (line 1082) | @Test
    class User (line 1097) | public class User {
      method User (line 1101) | public User(String username) {
      method getUsername (line 1105) | public String getUsername() {
    method testSliceWithNullInput (line 1110) | @Test
    method testSliceWithDefaultArgs (line 1124) | @Test
    method testSliceWithInvalidFirstArg (line 1139) | @Test
    method testSliceWithIntegerArguments (line 1155) | @Test
    method testSliceWithInvalidSecondArg (line 1172) | @Test
    method testSliceWithInvalidSecondArg2 (line 1188) | @Test
    method testSliceWithString (line 1204) | @Test
    method testSliceWithList (line 1219) | @Test
    method testSliceWithStringArray (line 1241) | @Test
    method testSliceWithPrimitivesArray (line 1257) | @Test
    method testSliceWithInvalidInputType (line 1323) | @Test
    method testLengthFilterInputs (line 1342) | @Test
    method testLengthFilterInTemplate (line 1361) | @Test
    method testReplaceFilterNullInput (line 1379) | @Test
    method testReplaceFilterInTemplate (line 1395) | @Test
    method testBase64EncoderFilterInTemplate (line 1415) | @Test
    method testBase64DecoderFilterInTemplate (line 1433) | @Test
    method testBase64DecodeFilterBadEncodedStringFail (line 1448) | @Test
    method testBase64DecodeFilterNoStringFail (line 1463) | @Test
    method testSha256FilterNoStringFail (line 1478) | @Test
    method testSha256FilterInTemplate (line 1496) | @Test
    method testMergeOk (line 1511) | @Test
    method testMergeMapWithStringAndFail (line 1529) | @Test
    method testMergeListWithStringAndFail (line 1544) | @Test
    method testMergeDifferentArraysAndFail (line 1559) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/CoreFunctionsTest.java
  class CoreFunctionsTest (line 27) | class CoreFunctionsTest {
    method testBlockFunction (line 31) | @Test
    method testParentFunction (line 41) | @Test
    method testParentBlockHasAccessToContext (line 57) | @Test
    method testParentThenMacro (line 68) | @Test
    method testParentFunctionWithTwoLevels (line 82) | @Test
    method testMinFunction (line 94) | @Test
    method testMaxFunction (line 110) | @Test
    method testRangeFunction (line 126) | @Test
    method testRangeFunctionIncrement2 (line 141) | @Test
    method testRangeFunctionDecrement2 (line 156) | @Test
    method testRangeFunctionIncrement0 (line 171) | @Test
    method testRangeFunctionChar (line 187) | @Test
    method testRangeFunctionCharIncrement2 (line 202) | @Test
    method testRangeFunctionCharDecrement2 (line 217) | @Test
    method testRangeFunctionCharIncrement0 (line 232) | @Test
    method testRangeFunctionLongVariable (line 248) | @Test
    method testRangeFunctionDoubleVariable (line 264) | @Test
    method testRangeFunctionIntegerVariable (line 280) | @Test
    method testRangeFunctionIncrementIntegerVariable (line 296) | @Test
    method testRangeFunctionIncrementDoubleVariable (line 313) | @Test
    class SimpleObject (line 330) | public class SimpleObject {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/CoreTagsTest.java
  class CoreTagsTest (line 36) | class CoreTagsTest {
    method testBlock (line 40) | @Test
    method skipGenerationBlock (line 51) | @Test
    method testBlockWithStringLiteralName (line 63) | @Test
    method testIf (line 76) | @Test
    method testIfThenElse (line 95) | @Test
    method testIfWithDirectProperty (line 112) | @Test
    method testIfWhenInvalidOrNoEndifTag (line 128) | @Test
    method testFlush (line 145) | @Test
    method testFor (line 161) | @Test
    method testForWithIterable (line 180) | @Test
    method testForWithMap (line 218) | @Test
    method testForSequenceNumber (line 238) | @Test
    method testForSequenceNumberException (line 252) | @Test
    method testForWhenInvalidOrNoEndforTag (line 267) | @Test
    method testFilterTag (line 284) | @Test
    method testChainedFilterTag (line 297) | @Test
    method testForIteratingOverProperty (line 313) | @Test
    method testForWithNullIterable (line 333) | @Test
    method testForWithArray (line 349) | @Test
    method testForWithArrayOfPrimitives (line 370) | @Test
    method multipleForLoops (line 395) | @Test
    method testForElse (line 415) | @Test
    method testCache (line 432) | @Test
    method testDisabledCache (line 454) | @Test
    method testCacheWithVariable (line 477) | @Test
    method testCacheWithNoName (line 500) | @Test
    class SimpleObjectA (line 518) | public static class SimpleObjectA {
      method getValue (line 522) | public String getValue() {
      method setValue (line 526) | void setValue(String value) {
    class SimpleObjectB (line 537) | public static class SimpleObjectB {
      method getValue (line 541) | public String getValue() {
      method setValue (line 545) | void setValue(String value) {
    method testMemberCacheWithNullObject (line 556) | @Test
    method testMemberCacheWithDifferingObjectTypes (line 585) | @Test
    method testImportWithinBlock (line 613) | @Test
    method testDynamicInclude (line 625) | @Test
    method testNonExistingMacroOrFunction (line 643) | @Test
    method testInclude (line 655) | @Test
    method testIncludeInheritance (line 670) | @Test
    method testIncludeWithinBlock (line 680) | @Test
    method testIncludePropagatesContext (line 693) | @Test
    method testIncludeOverridesBlocks (line 707) | @Test
    method testIncludeOverridesVariable (line 721) | @Test
    method testSet (line 731) | @Test
    method testSetInChildTemplateOutsideOfBlock (line 746) | @Test
    method testReSetInForLoop (line 756) | @Test
    method testVerbatim (line 777) | @Test
    method testParallel (line 791) | @Test
    method testParallelTagWhileEvaluationContextIsChanging (line 814) | @Test
    method testNestedParallel (line 835) | @Test
    method testIncludeWithinParallelTag (line 858) | @Test
    method testParallelWithoutExecutorService (line 875) | @Test
    method testParallelWithImport (line 896) | @Test
    class SlowObject (line 908) | public class SlowObject {
      method first (line 910) | public String first() {
      method second (line 920) | public String second() {
      method third (line 930) | public String third() {
      method fourth (line 940) | public String fourth() {
    class User (line 951) | public class User {
      method User (line 955) | public User(String username) {
      method getUsername (line 959) | public String getUsername() {
    class Classroom (line 964) | public class Classroom {
      method getUsers (line 968) | public List<User> getUsers() {
      method setUsers (line 972) | void setUsers(List<User> users) {
    class FlushAwareWriter (line 977) | public class FlushAwareWriter extends StringWriter {
      method flush (line 981) | @Override
      method getFlushedBuffers (line 987) | public List<String> getFlushedBuffers() {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/CoreTestsTest.java
  class CoreTestsTest (line 28) | class CoreTestsTest {
    method testEven (line 30) | @Test
    method testEvenWithInteger (line 47) | @Test
    method testNullEven (line 62) | @Test
    method testOdd (line 76) | @Test
    method testOddWithInteger (line 93) | @Test
    method testNullOdd (line 108) | @Test
    method testNull (line 122) | @Test
    method testEmpty (line 137) | @Test
    method testIterables (line 152) | @Test
    method testIsnt (line 169) | @Test
    method testNegativeTest (line 187) | @Test
    method testNegativeTestOnAttribute (line 205) | @Test
    method testMapTest (line 219) | @Test
    method testDefined (line 236) | @Test
    method testDefinedWithMap (line 254) | @Test
    class Classroom (line 273) | public static class Classroom {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/DynamicNamedArgsTest.java
  class DynamicNamedArgsTest (line 20) | class DynamicNamedArgsTest {
    class Operation (line 22) | static class Operation {
      method Operation (line 26) | Operation(String path, String... queryParameters) {
      method getPath (line 31) | public String getPath() {
      method getQueryParameters (line 35) | public List<String> getQueryParameters() {
    class QueryStringArgsNullFilter (line 43) | static class QueryStringArgsNullFilter implements Filter {
      method apply (line 44) | @Override
      method getArgumentNames (line 55) | @Override
    class QueryStringArgsEmptyFilter (line 61) | static class QueryStringArgsEmptyFilter implements Filter {
      method apply (line 62) | @Override
      method getArgumentNames (line 73) | @Override
    class QueryStringExtension (line 79) | static class QueryStringExtension extends AbstractExtension {
      method getFilters (line 80) | @Override
    method shouldSupportDynamicNamedArgumentsWhenArgumentsIsNull (line 89) | @Test
    method shouldSupportDynamicNamedArgumentsWhenArgumentsIsEmpty (line 108) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/EmbedCachingTagTest.java
  class EmbedCachingTagTest (line 22) | class EmbedCachingTagTest {
    method EmbedCachingTagTest (line 27) | public EmbedCachingTagTest() {
    method testEmbedNotChangingCachedTemplate (line 47) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/EmbedTagTest.java
  class EmbedTagTest (line 26) | class EmbedTagTest {
    method tests (line 34) | @ParameterizedTest
    method setUp (line 61) | private void setUp() {
    method renderTemplateAndCheck (line 81) | private void renderTemplateAndCheck() throws PebbleException, IOExcept...
    method renderTemplate (line 119) | private Pair<String, Throwable> renderTemplate() {
    method getResource (line 129) | private String getResource(String filename) {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/EnumEqualsTest.java
  class EnumEqualsTest (line 20) | class EnumEqualsTest {
    method testEnumComparision (line 22) | @Test
    type TestEnum (line 38) | public enum TestEnum {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ErrorReportingTest.java
  class ErrorReportingTest (line 25) | class ErrorReportingTest {
    method testLineNumberErrorReportingWithUnixNewlines (line 28) | @Test
    method testLineNumberErrorReportingWithWindowsNewlines (line 40) | @Test
    method testLineNumberErrorReportingDuringEvaluation (line 51) | @Test
    method testInvalidPropertyReferenceInStrictMode (line 67) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/EscaperExtensionTest.java
  class EscaperExtensionTest (line 33) | class EscaperExtensionTest {
    method testEscapeHtml (line 35) | @Test
    method testPrintBigDecimal (line 47) | @Test
    method testEscapeContextVariable (line 66) | @Test
    method testEscapeWithNamedArguments (line 80) | @Test
    method testAutoescapeLiteral (line 92) | @Test
    method testAutoescapePrintExpression (line 102) | @Test
    method testAutoescapeNonString (line 114) | @Test
    method testDisableAutoEscaping (line 126) | @Test
    method testEscapeIntoAbbreviate (line 139) | @Test
    method testDoubleEscaping (line 151) | @Test
    method testAutoescapeToken (line 163) | @Test
    method testAutoEscapingMacroOutput (line 179) | @Test
    method testAutoEscapingInclude (line 192) | @Test
    method testAutoEscapingParentFunction (line 203) | @Test
    method testAutoEscapingBlockFunction (line 214) | @Test
    method testCustomEscapingStrategy (line 227) | @Test
    method testEscapeFunction (line 243) | @Test
    method testNoEscapeMacro (line 255) | @Test
    method testCompareSafeStrings (line 267) | @Test
    method testEscapeJson (line 279) | @Test
    class TestExtension (line 298) | public static class TestExtension extends AbstractExtension {
      method getFunctions (line 300) | @Override

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ExtendingPebbleTest.java
  class ExtendingPebbleTest (line 32) | class ExtendingPebbleTest {
    method testFilterWithoutArgumentsCanAccessEvaluationContext (line 37) | @Test
    method testCustomAttributeResolverEvaluateFirst (line 53) | @Test
    class CustomExtensionWithFilter (line 70) | private static final class CustomExtensionWithFilter extends AbstractE...
      method getFilters (line 72) | @Override
    class CustomExtensionWithAttributeResolver (line 99) | private static final class CustomExtensionWithAttributeResolver extend...
      method getAttributeResolver (line 101) | @Override
    class SimplePerson (line 112) | private static class SimplePerson {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/FileLoaderTest.java
  class FileLoaderTest (line 21) | public class FileLoaderTest {
    method testFileLoaderPrefixNull (line 23) | @Test
    method testFileLoaderPrefixEmpty (line 28) | @Test
    method testFileLoaderPrefixRelativePath (line 33) | @Test
    method testFileLoader (line 38) | @Test
    method testFileLoaderAbsoluteTemplateName (line 50) | @Test
    method testFileLoaderTemplateNameIsADirectory (line 59) | @Test
    method testFileLoaderRelativeTemplateName (line 67) | @Test
    method testFileLoaderPathTraversal (line 79) | @Test
    method testFileLoaderPathTraversalEncoded (line 88) | @ParameterizedTest
    method testFileLoaderUnsupportedCharset (line 98) | @Test
    method testFileLoaderPathWithBackslash (line 110) | @Test
    method testFileLoaderPathWithForwardSlash (line 123) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/ForTest.java
  class ForTest (line 20) | class ForTest {
    method testForLengthWithOperation (line 21) | @Test
    method testForRevIndexWithOperation (line 39) | @Test
    method testInvalidIdentifierName (line 57) | @Test
    class User (line 70) | public static class User {
      method User (line 73) | public User(String username) {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/GetAttributeTest.java
  class GetAttributeTest (line 27) | class GetAttributeTest {
    method testOneLayerAttributeNesting (line 29) | @Test
    method testAttributeCacheHitting (line 43) | @Test
    method testMultiLayerAttributeNesting (line 57) | @Test
    method testHashmapAttribute (line 72) | @Test
    method testHashmapAttributeWithArgumentOfNull (line 88) | @Test
    method testNonExistingHashMapAttributeWithoutStrictVariables (line 102) | @Test
    method testNonExistingMapAttributeWithStrictVariables (line 121) | @Test
    method testNonExistingMapAttributeWithStrictVariablesAndEmptyMap (line 140) | @Test
    method testNullMapValueWithoutStrictVariables (line 157) | @Test
    method testNullMapValueWithStrictVariables (line 177) | @Test
    method testMethodAttribute (line 194) | @Test
    method testTwoMethodsAlmostSameName (line 208) | @Test
    method testAccessingClass_AllowUnsafeMethodsOn_StrictVariableOff_Property (line 237) | @Test
    method testAccessingClass_AllowUnsafeMethodsOn_StrictVariableOff_Method (line 254) | @Test
    method testAccessingClass_AllowUnsafeMethodsOn_StrictVariableOn_Property (line 271) | @Test
    method testAccessingClass_AllowUnsafeMethodsOn_StrictVariableOn_Method (line 288) | @Test
    method testAccessingClass_AllowUnsafeMethodsOff_StrictVariableOff_Property (line 305) | @Test
    method testAccessingClass_AllowUnsafeMethodsOff_StrictVariableOff_Method (line 322) | @Test
    method testAccessingClass_AllowUnsafeMethodsOff_StrictVariableOn_Property (line 339) | @Test
    method testAccessingClass_AllowUnsafeMethodsOff_StrictVariableOn_Method (line 356) | @Test
    method testAccessingClass_AllowUnsafeMethodsOnIsCaseInsensitive_Property (line 373) | @Test
    method testAccessingClass_AllowUnsafeMethodsOffIsCaseInsensitive_Property (line 390) | @Test
    method testAccessingClass_AllowUnsafeMethodsOnIsCaseInsensitive_Method (line 407) | @Test
    method testAccessingClass_AllowUnsafeMethodsOffIsCaseInsensitive_Method (line 424) | @Test
    method testAccessingClass_AllowUnsafeMethodsOffForMethodNotify_thenThrowException (line 441) | @Test
    method testMethodAttributeWithDifferentObjects (line 462) | @Test
    method testBeanMethodWithArgument (line 481) | @Test
    method testBeanMethodWithLongArgument (line 495) | @Test
    method testBeanMethodWithLongArgument2 (line 509) | @Test
    method testBeanMethodWithTreatLiteralDecimalAsLong (line 523) | @Test
    method testBeanMethodWithTreatNumberAsInteger (line 543) | @Test
    method testBeanMethodWithGreedyMatchArgument (line 558) | @Test
    method testBeanMethodWithNumberLiteralsAsBigDecimals (line 573) | @Test
    method testBeanMethodWithoutNumberLiteralsAsBigDecimals (line 587) | @Test
    method testBeanMethodWithOverloadedArgument (line 602) | @Test
    method testBeanMethodWithTwoArguments (line 616) | @Test
    method testGetMethodAttribute (line 630) | @Test
    method testHasMethodAttribute (line 644) | @Test
    method testIsMethodAttribute (line 658) | @Test
    method testComplexNestedAttributes (line 672) | @Test
    method testAttributeOfNullObjectWithStrictVariables (line 687) | @Test
    method testAttributeOfNullObjectWithoutStrictVariables (line 700) | @Test
    method testNonExistingAttributeWithoutStrictVariables (line 716) | @Test
    method testNonExistingAttributeWithStrictVariables (line 730) | @Test
    method testNullAttributeWithoutStrictVariables (line 746) | @Test
    method testNullAttributeWithStrictVariables (line 764) | @Test
    method testPrimitiveAttribute (line 779) | @Test()
    method testArrayIndexAttribute (line 793) | @Test
    method testListIndexAttribute (line 811) | @Test
    method testListNonExistingIndexAttributeWithStrictMode (line 832) | @Test
    method testListNonExistingIndexAttribute (line 853) | @Test
    method testInheritedAttribute (line 868) | @Test()
    class Person (line 883) | public class Person {
    method testAccessingValueWithSubscriptInLoop (line 889) | @Test
    class SimpleObject (line 905) | public class SimpleObject {
    class SimpleObject2 (line 910) | public class SimpleObject2 {
    class SimpleObject3 (line 915) | public class SimpleObject3 {
    class SimpleObject4 (line 920) | public class SimpleObject4 {
      method name (line 922) | public String name() {
    class SimpleObject5 (line 927) | public class SimpleObject5 {
      method getName (line 929) | public String getName() {
    class SimpleObject6 (line 934) | public class SimpleObject6 {
      method isName (line 936) | public String isName() {
    class SimpleObject7 (line 941) | public class SimpleObject7 {
    class SimpleObject8 (line 946) | public class SimpleObject8 {
    class SimpleObject9 (line 951) | public class SimpleObject9 {
      method hasName (line 953) | public String hasName() {
    class ObjectMethodSameName (line 958) | public class ObjectMethodSameName {
      method something (line 960) | public String something() {
      method hasSomething (line 964) | public boolean hasSomething() {
    class BeanWithMethodsThatHaveArguments (line 969) | public class BeanWithMethodsThatHaveArguments {
      method getName (line 971) | public String getName(String name) {
      method getNumber (line 975) | public Double getNumber(Double number) {
      method getNumber (line 979) | public Long getNumber(Long number) {
      method getInteger (line 983) | public Integer getInteger(Integer number) {
      method getShort (line 987) | public Short getShort(short number) {
      method multiply (line 991) | public Long multiply(Long one, Long two) {
    class ComplexObject (line 996) | public class ComplexObject {
    class CustomizableObject (line 1006) | public class CustomizableObject {
      method CustomizableObject (line 1010) | public CustomizableObject(String name) {
      method getName (line 1014) | public String getName() {
    class ChildObject (line 1019) | public class ChildObject extends ParentObject {
    class ParentObject (line 1023) | public class ParentObject {
      method getName (line 1025) | public String getName() {
    method testPrimitiveArgument (line 1030) | @Test()
    method testBeanMethodWithNullArgument (line 1048) | @Test
    class PrimitiveArguments (line 1063) | public class PrimitiveArguments {
      method getStringFromLong (line 1065) | public String getStringFromLong(long id) {
      method getStringFromLongs (line 1069) | public String getStringFromLongs(Long first, long second) {
      method getStringFromBoolean (line 1073) | public String getStringFromBoolean(boolean bool) {
    method testAttributePrimitiveAccessWithEmptyMap (line 1078) | @Test
    method testAttributePrimitiveAccessWithInteger (line 1093) | @Test
    method testAttributePrimitiveAccess (line 1100) | private String testAttributePrimitiveAccess(Number value) throws Pebbl...
    method testAttributePrimitiveAccessWithLong (line 1115) | @Test
    method testAttributePrimitiveAccessWithDouble (line 1122) | @Test
    method testAttributePrimitiveAccessWithFloat (line 1129) | @Test
    method testAttributePrimitiveAccessWithShort (line 1136) | @Test
    method testAttributePrimitiveAccessWithByte (line 1143) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/I18nExtensionTest.java
  class I18nExtensionTest (line 24) | class I18nExtensionTest {
    method testSimpleLookup (line 26) | @Test
    method testMessageWithNamedArguments (line 37) | @Test
    method testLookupWithLocale (line 49) | @Test
    method testLookupSpecialChar (line 60) | @Test
    method testMessageWithParams (line 72) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/IncludeWithParameterTest.java
  class IncludeWithParameterTest (line 21) | class IncludeWithParameterTest {
    method testIncludeWithParameters (line 26) | @Test
    method testIncludeWithParametersIsolated (line 45) | @Test
    method testIncludeWithParameterObject (line 62) | @Test
    class TestObject (line 77) | public static class TestObject {

FILE: pebble/src/test/java/io/pebbletemplates/pebble/InheritanceTest.java
  class InheritanceTest (line 25) | class InheritanceTest {
    method testSimpleInheritance (line 29) | @Test
    method testMultiLevelInheritance (line 43) | @Test
    method testDynamicInheritance (line 57) | @Test
    method testNullParent (line 74) | @Test

FILE: pebble/src/test/java/io/pebbletemplates/pebble/LoaderTest.java
  class LoaderTest (line 30) | class LoaderTest {
    method testClassLoaderLoader (line 32) | @Test
    method testClassLoaderLoaderWithNestedTemplate (line 45) | @Test
    method testClassLoaderLoaderWithNestedTemplateInJar (line 58) | @Test
    method testDelegatingLoader (line 73) | @Test
    method testDelegatingLoaderWithFileLoaderThatThrowsInvalidPathException (line 89) | @Test
    method testMemoryLoader (line 115) | @Test
    method testGetLiteralTemplate (line 145) | @Test
    class StringLoaderFailure (line 161) | private class StringLoaderFailure extends StringLoader {
      method getReader (line 163) | @Override
    class StringLoaderOne (line 169) | private class StringLoaderOne extends StringLoader {
      method getReader (line 171) | @Override
    class StringLoaderTwo (line 178) | private class StringLoaderTwo extends StringLoader {
      method getReader (line 180) | @Override

FILE: pebble/src/test/java/io/pebbletemplates/pebble/LogicTest.java
  class LogicTest (line 37) | class LogicTest {
    method testUnaryOperators (line 39) | @Test
    method testNotUnaryOperator (line 52) | @Test
    method testNotUnaryOperatorWithStrictVariables (line 85) | @Test
    method testTruthinessOfNullVariableWithoutStrictMode (line 127) | @Test
    method testTruthinessOfNullVariableWithStrictMode (line 159) | @Test
    method testBinaryOperators (line 198) | @Test
    method testBinaryOperatorOnAttribute (line 215) | @Test
    method testBinaryOperatorsBigDecimal (line 232) | @Test
    method testBinaryOperatorsBigDecimalWithDouble (line 250) | @Test
    method testBinaryOperatorsBigInteger (line 268) | @Test
    method testBinaryOperatorsBigIntegerWithLong (line 286) | @Test
    method testBinaryOperatorsShort (line 304) | @Test
    method testBinaryOperatorsWithStringOperands (line 322) | @ParameterizedTest
    method binaryOperatorTestData (line 339) | private static Stream<Arguments> binaryOperatorTestData() {
    method testUnaryOperatorOnAttribute (line 505) | @Test
    method testNotUnaryOperatorOnAttribute (line 520) | @Test
    method testLogicOperatorOnAttributes (line 535) | @Test
    method testLogicOperatorsWithNullValues (line 551) | @Test
    method testLogicOperatorsWithNullValuesWithStrictVariables (line 593) | @Test
    method testNotOperatorPrecedence (line 683) | @Test
    method testNotOperatorWithParenthesisPrecedence (line 698) | @Test
    method testTernary (line 713) | @Test
    method testComparisons (line 727) | @Test
    method testComparisonsOnDifferingOperands (line 755) | @Test
    method testEqualsOperator (line 769) | @Test()
    method testEqualsOperatorWithNulls (line 785) | @Test()
    method testNotEqualsOperator (line 801) | @Test()
    method testEqualsOperatorWithPrimitives (line 817) | @Test()
    method testEqualsOperatorWithNumberObjects (line 839) | @SuppressWarnings({"unchecked", "rawtypes"})
    method testComparisonWithAttributeOperand (line 875) | @Test()
    method testComparisonBigDecimal (line 894) | @Test()
    method testComparisonWithNull (line 926) | @Test()
    method testComparisonWithNull2 (line 944) | @Test()
    method testComparisonBigDecimalWithDouble (line 962) | @Test()
    class Item (line 994) | public class Item {
    method testIsOperatorPrecedence (line 1005) | @Test()
    method testIsOperatorPrecedenceWithAnd (line 1019) | @Test()
    method testContainsOperator (line 1033) | @Test
    method testContainsOperatorWithNull (line 1050) | @Test
    method testContainsOpera
Condensed preview — 788 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,590K chars).
[
  {
    "path": ".gitattributes",
    "chars": 66,
    "preview": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 29,
    "preview": "buy_me_a_coffee: erbussierel\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 182,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Community Support\n    url: https://github.com/PebbleTemplates/pebbl"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue.md",
    "chars": 1276,
    "preview": "---\nname: General\nabout: Bugs, enhancements, documentation, tasks.\ntitle: ''\nlabels: ''\nassignees: ''\n---\n\n<!--\nThanks f"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1474,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"maven\"\n    directories:\n      - \"/pebble\"\n      - \"/pebble-spring/pebble-spr"
  },
  {
    "path": ".github/workflows/maven.yml",
    "chars": 1213,
    "preview": "# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow executi"
  },
  {
    "path": ".gitignore",
    "chars": 224,
    "preview": "*.class\n\n# Package Files #\n*.jar\n*.war\n*.ear\n\n# Mac OS X\n.DS_Store\n\n# Eclipse #\n.project\n.classpath\n.settings/\n\n# Intell"
  },
  {
    "path": "LICENSE",
    "chars": 1492,
    "preview": "Copyright (c) 2013, Mitchell Bösecke\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or wi"
  },
  {
    "path": "README.md",
    "chars": 4409,
    "preview": "# Pebble [![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoff"
  },
  {
    "path": "SECURITY.md",
    "chars": 344,
    "preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nIf you think you have found a security vulnerability, please ***DO NOT*"
  },
  {
    "path": "docs/pom.xml",
    "chars": 2722,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "docs/src/orchid/resources/assets/css/github-fork-ribbon.css",
    "chars": 3715,
    "preview": "/*!\n * \"Fork me on GitHub\" CSS ribbon v0.2.2 | MIT License\n * https://github.com/simonwhitaker/github-fork-ribbon-css\n*/"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_0.md",
    "chars": 977,
    "preview": "---\nversion: '3.0.0'\n---\n\n- Java 8\n- Macros have access to all variables within the template and are no longer restricte"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_1.md",
    "chars": 146,
    "preview": "---\nversion: '3.0.1'\n---\n\n- Macros are restricted to a local scope (#371)\n- Macros have access to global attributes via "
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_10.md",
    "chars": 164,
    "preview": "---\nversion: '3.0.10'\n---\n\n- Add support for JDK 9++ (#442, #443)\n- Add macro support for errors(BindingResult) in sprin"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_2.md",
    "chars": 184,
    "preview": "---\nversion: '3.0.2'\n---\n\n- Add PebbleCache interface and use ConcurrentMap instead of Caffeine as default template/tag "
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_3.md",
    "chars": 238,
    "preview": "---\nversion: '3.0.3'\n---\n\n- Support more expressions for if operator (#387)\n- Consider adding greedyMatchMethod to Pebbl"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_4.md",
    "chars": 272,
    "preview": "---\nversion: '3.0.4'\n---\n\n- Make NOT operator more tolerant to argument type (#394)\n- Make ternary if operator more tole"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_5.md",
    "chars": 130,
    "preview": "---\nversion: '3.0.5'\n---\n\n- Cannot access List methods (#402)\n- Implement to boolean smart-casting in OR and AND operato"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_6.md",
    "chars": 205,
    "preview": "---\nversion: '3.0.6'\n---\n\n- Check that parseNewVariableName() parses a valid identifier (#409) \n- Set up Pebble document"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_7.md",
    "chars": 88,
    "preview": "---\nversion: '3.0.7'\n---\n\n- Add Automatic-Module-Name to support Java 9 modules (#416) \n"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_8.md",
    "chars": 53,
    "preview": "---\nversion: '3.0.8'\n---\n\n- Add split filter (#421) \n"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_0_9.md",
    "chars": 168,
    "preview": "---\nversion: '3.0.9'\n---\n\n- Add embed tag (#319, #318, #224, #378, #434)\n- Offline documentation (#282, #432)\n- Make all"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_0.md",
    "chars": 571,
    "preview": "---\nversion: '3.1.0'\n---\n\n- **BREAKING CHANGES**: Consider avoiding feature version in spring boot starter name (#459)\n-"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_1.md",
    "chars": 449,
    "preview": "---\nversion: '3.1.1'\n---\n\n- Use a list of unsafeMethods and rename allowGetClass to allowUnsafeMethods (#454)\n- PebbleTe"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_2.md",
    "chars": 132,
    "preview": "---\nversion: '3.1.2'\n---\n\n- Add support for jdk13 (#487)\n- Add basic support for Spring 5 WebFlux reactive in Spring Boo"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_3.md",
    "chars": 299,
    "preview": "---\nversion: '3.1.3'\n---\n\n- Allow treating all number literals as BigDecimals to avoid NumberFormatExceptions (#503)\n- C"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_4.md",
    "chars": 473,
    "preview": "---\nversion: '3.1.4'\n---\n\n- Slice filter: Use collection size when toIndex is greater than collection size  (#504)\n- Adj"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_5.md",
    "chars": 686,
    "preview": "---\nversion: '3.1.5'\n---\n\n- Add timeZone parameter to date filter  (#530)\n- Add setting to limit the size of output when"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_1_6.md",
    "chars": 156,
    "preview": "---\nversion: '3.1.6'\n---\n\n- Make CacheKey class extendible (#604)\n- Remove support for spring 1.5.x (#628)\n- Fix for old"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_2_0.md",
    "chars": 714,
    "preview": "---\nversion: '3.2.0'\n---\n\n- Add support for spring framework 6 and spring-boot 3 (#630)\n- Bump minimum supported java ve"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_2_1.md",
    "chars": 125,
    "preview": "---\nversion: '3.2.1'\n---\n\n- Fix the null pointer exception on the replace filter (#650)\n- Add native hints for GraalVM ("
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_2_2.md",
    "chars": 343,
    "preview": "---\nversion: '3.2.2'\n---\n\n- Throw a more detailed exception from DefaultAttributeResolver (#653)\n- Make expression nodes"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_2_3.md",
    "chars": 167,
    "preview": "---\nversion: '3.2.3'\n---\n\n- Dynamically open different feature according to different scenarios (#671)\n- Fix the ability"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v3_2_4.md",
    "chars": 154,
    "preview": "---\nversion: '3.2.4'\n---\n\n- Fix the problem of unit test failure under JDK 21 (#692)\n- Fix the problem of not resolving "
  },
  {
    "path": "docs/src/orchid/resources/changelog/v4_0_0.md",
    "chars": 1519,
    "preview": "---\nversion: '4.0.0'\n---\n\n# BREAKING CHANGES\n- Add support for spring boot 4 (#704)\n- Use one of the following artifactI"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v4_1_0.md",
    "chars": 915,
    "preview": "---\nversion: '4.1.0'\n---\n\n# BREAKING CHANGES\n- If you do not provide a custom Loader, Pebble will now use only a `Classp"
  },
  {
    "path": "docs/src/orchid/resources/changelog/v4_1_1.md",
    "chars": 178,
    "preview": "---\nversion: '4.1.1'\n---\n\n# New Features\n- Expose AST Root Node to Enable Custom NodeVisitor Implementation (#701)\n\n# Bu"
  },
  {
    "path": "docs/src/orchid/resources/config.yml",
    "chars": 1723,
    "preview": "site:\n  about:\n    siteName: 'Pebble Templates'\n    subtitle: 'A lightweight but rock solid Java templating engine.'\n\nth"
  },
  {
    "path": "docs/src/orchid/resources/data/contributors.yml",
    "chars": 534,
    "preview": "- name: Mitchell Bösecke\n  link: https://github.com/mbosecke\n- name: Eric Bussieres\n  link: https://github.com/ebussiere"
  },
  {
    "path": "docs/src/orchid/resources/data/twig-compatibility/filters.yml",
    "chars": 3836,
    "preview": "- name: 'abs'\n  twigLink: 'https://twig.symfony.com/doc/2.x/filters/abs.html'\n  support: 'full'\n  page: 'abs'\n- name: 'b"
  },
  {
    "path": "docs/src/orchid/resources/data/twig-compatibility/functions.yml",
    "chars": 1547,
    "preview": "- name: 'attribute'\n  twigLink: 'https://twig.symfony.com/doc/2.x/functions/attribute.html'\n  support: 'none'\n- name: 'b"
  },
  {
    "path": "docs/src/orchid/resources/data/twig-compatibility/operators.yml",
    "chars": 1176,
    "preview": "- name: 'in'\n  twigLink: 'https://twig.symfony.com/doc/2.x/templates.html#containment-operator'\n  support: 'none'\n  page"
  },
  {
    "path": "docs/src/orchid/resources/data/twig-compatibility/tags.yml",
    "chars": 2226,
    "preview": "- name: 'autoescape'\n  twigLink: 'https://twig.symfony.com/doc/2.x/tags/autoescape.html'\n  support: 'full'\n  page: 'auto"
  },
  {
    "path": "docs/src/orchid/resources/data/twig-compatibility/tests.yml",
    "chars": 984,
    "preview": "- name: 'constant'\n  twigLink: 'https://twig.symfony.com/doc/2.x/tests/constant.html'\n  support: 'none'\n- name: 'defined"
  },
  {
    "path": "docs/src/orchid/resources/homepage.md",
    "chars": 2724,
    "preview": "---\n---\n\nPebble is a Java templating engine inspired by <a href=\"https://twig.symfony.com/\">Twig</a> and similar to the "
  },
  {
    "path": "docs/src/orchid/resources/pages/CNAME",
    "chars": 62,
    "preview": "---\nrenderMode: raw\nusePrettyUrl: false\n---\npebbletemplates.io"
  },
  {
    "path": "docs/src/orchid/resources/pages/changelog.md",
    "chars": 40,
    "preview": "---\ncomponents:\n  - type: changelog\n---\n"
  },
  {
    "path": "docs/src/orchid/resources/pages/contributing.md",
    "chars": 4797,
    "preview": "---\n---\n\n# Contributing\n\n## Help Wanted\nContributors of all types are welcome but most importantly I am looking for help"
  },
  {
    "path": "docs/src/orchid/resources/pages/twig-compatibility.peb",
    "chars": 1355,
    "preview": "---\ntitle: Twig Compatibility\n---\n\nWhile Pebble was inspired by and generally has high compatibility with Twig, it is ne"
  },
  {
    "path": "docs/src/orchid/resources/templates/includes/sidebar.peb",
    "chars": 2096,
    "preview": "<div id=\"sidebar\">\n    <div class=\"inner\">\n\n        <!-- Search -->\n        <section id=\"search\" class=\"alt\">\n          "
  },
  {
    "path": "docs/src/orchid/resources/templates/layouts/index.peb",
    "chars": 2109,
    "preview": "<!DOCTYPE HTML>\n<!--\n    Editorial by HTML5 UP\n    html5up.net | @ajlkn\n    Free for personal and commercial use under t"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/abbreviate.md",
    "chars": 336,
    "preview": "# `abbreviate`\nThe `abbreviate` filter will abbreviate a string using an ellipsis. It takes one argument which is the ma"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/abs.md",
    "chars": 107,
    "preview": "# `abs`\nThe `abs` filter is used to obtain the absolute value.\n\n```twig\n{{ -7 | abs }}\n\n{# output: 7 #}\n```"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/base64decode.md",
    "chars": 378,
    "preview": "---\n---\n\n# `base64decode`\nThe `base64decode` filter takes the given input, Base64-decodes it, if possible, and returns t"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/base64encode.md",
    "chars": 279,
    "preview": "---\n---\n\n# `base64encode`\nThe `base64encode` filter takes the given input, converts it to an UTF-8 String (`.toString()`"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/capitalize.md",
    "chars": 278,
    "preview": "---\n---\n\n# `capitalize`\nThe `capitalize` filter will capitalize the first letter of the string.\n```twig\n{% verbatim %}\n{"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/date.md",
    "chars": 1633,
    "preview": "# `date`\nThe `date` filter formats a date in a variety of formats. It can handle old-school `java.util.Date`,\nJava 8 `ja"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/default.md",
    "chars": 649,
    "preview": "## `default`\nThe `default` filter will render a default value if and only if the object being filtered is empty.\nA varia"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/escape.md",
    "chars": 436,
    "preview": "---\n---\n\n# `escape`\nThe `escape` filter will turn special characters into safe character references in order to avoid XS"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/first.md",
    "chars": 247,
    "preview": "# `first`\nThe `first` filter will return the first item of a collection, or the first letter of a string.\n```twig\n{{ use"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/format.md",
    "chars": 221,
    "preview": "# `format`\nThe `format` filter formats a string by replacing placeholders with the provided arguments (placeholders foll"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/join.md",
    "chars": 372,
    "preview": "# `join`\nThe `join` filter will concatenate all items of a collection into a string. An optional argument can be given\nt"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/last.md",
    "chars": 240,
    "preview": "# `last`\nThe `last` filter will return the last item of a collection, or the last letter of a string.\n```twig\n{{ users |"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/length.md",
    "chars": 165,
    "preview": "# `length`\nThe `length` filter returns the number of items of collection, map or the length of a string:\n\n```twig\n{% if "
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/lower.md",
    "chars": 196,
    "preview": "# `lower`\nThe `lower` filter makes an entire string lower case.\n```twig\n{{ \"THIS IS A LOUD SENTENCE\" | lower }}\n```\nThe "
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/nl2br.md",
    "chars": 349,
    "preview": "# `nl2br`\n\nThe `nl2br` filter converts newline characters (`\\r`, `\\n`, `\\r\\n`) in a string to HTML line break tags (`<br"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/numberformat.md",
    "chars": 269,
    "preview": "# `numberformat`\nThe `numberformat` filter is used to format a decimal number. Behind the scenes it uses `java.text.Deci"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/raw.md",
    "chars": 724,
    "preview": "---\n---\n\n# `raw`\nThe `raw` filter prevents the output of an expression from being escaped by the autoescaper.\nThe `raw` "
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/replace.md",
    "chars": 245,
    "preview": "# `replace`\nThe 'replace' filter formats a given string by replacing the placeholders (placeholders are free-form):\n```t"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/reverse.md",
    "chars": 119,
    "preview": "# `reverse`\nThe 'reverse' filter reverses a List:\n```twig\n{% for user in users | reverse %} {{ user }} {% endfor %}\n```"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/rsort.md",
    "chars": 189,
    "preview": "# `rsort`\nThe `rsort` filter will sort a list in reversed order. The items of the list must implement `Comparable`.\n```t"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/sha256.md",
    "chars": 275,
    "preview": "---\n---\n\n# `sha256`\nThe `sha256` filter returns the SHA-256 hash of the given UTF-8 String.\n\n```twig\n{% verbatim %}{{ \"t"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/slice.md",
    "chars": 317,
    "preview": "# `slice`\nThe `slice` filter returns a portion of a list, array, or string.\n```twig\n{{ ['apple', 'peach', 'pear', 'banan"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/sort.md",
    "chars": 168,
    "preview": "# `sort`\nThe `sort` filter will sort a list. The items of the list must implement `Comparable`.\n```twig\n{% for user in u"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/split.md",
    "chars": 918,
    "preview": "# `split`\nThe `split` filter splits a string by the given delimiter and returns a list of strings.\n```twig\n{% set foo = "
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/title.md",
    "chars": 269,
    "preview": "---\n---\n\n# `title`\nThe `title` filter will capitalize the first letter of each word.\n```twig\n{% verbatim %}\n{{ \"article "
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/trim.md",
    "chars": 254,
    "preview": "# `trim`\nThe `trim` filter is used to trim whitespace off the beginning and end of a string.\n```twig\n{{ \"    This text h"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/upper.md",
    "chars": 201,
    "preview": "# `upper`\nThe `upper` filter makes an entire string upper case.\n\n```twig\n{{ \"this is a quiet sentence.\" | upper }}\n```\nT"
  },
  {
    "path": "docs/src/orchid/resources/wiki/filter/urlencode.md",
    "chars": 272,
    "preview": "# `urlencode`\n\nThe `urlencod` translates a string into `application/x-www-form-urlencoded` format using the \"UTF-8\" enco"
  },
  {
    "path": "docs/src/orchid/resources/wiki/function/blockFunction.md",
    "chars": 923,
    "preview": "---\n---\n\n# `block`\nThe `block` function is used to render the contents of a block more than once. It is not to be confus"
  },
  {
    "path": "docs/src/orchid/resources/wiki/function/i18n.md",
    "chars": 1141,
    "preview": "# `i18n`\nThe `i18n` function is used to retrieve messages from a locale-specific `ResourceBundle`.\nEvery `PebbleTemplate"
  },
  {
    "path": "docs/src/orchid/resources/wiki/function/max.md",
    "chars": 115,
    "preview": "# `max`\nThe `max` function will return the largest of it's numerical arguments.\n```twig\n{{ max(user.age, 80) }}\n```"
  },
  {
    "path": "docs/src/orchid/resources/wiki/function/min.md",
    "chars": 116,
    "preview": "# `min`\nThe `min` function will return the smallest of it's numerical arguments.\n```twig\n{{ min(user.age, 80) }}\n```"
  },
  {
    "path": "docs/src/orchid/resources/wiki/function/parent.md",
    "chars": 654,
    "preview": "# `parent`\n\nThe `parent` function is used inside of a block to render the content that the parent template would\nhave re"
  },
  {
    "path": "docs/src/orchid/resources/wiki/function/range.md",
    "chars": 549,
    "preview": "# `range`\nThe `range` function will return a list containing an arithmetic progression of numbers:\n```twig\n{% for i in r"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/basic-usage.md",
    "chars": 14557,
    "preview": "---\n---\n\n# Basic Usage\n\n## Introduction\nPebble templates can be used to generate any sort of textual output. It is typic"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/customize-defaults.md",
    "chars": 2414,
    "preview": "---\n---\n\nPebble comes with a rich set of built-in tags and filters that will help you render your templates into  websit"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/escaping.md",
    "chars": 4397,
    "preview": "---\n---\n\n# Escaping\n\n## Overview\n[XSS vulnerabilites](https://en.wikipedia.org/wiki/Cross-site_scripting) are the most c"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/extending-pebble.md",
    "chars": 12917,
    "preview": "---\n---\n\n# Extending Pebble\n\n## Overview\nPebble was designed to be flexible and accomodate the requirements of any proje"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/high-performance.md",
    "chars": 1223,
    "preview": "---\n---\n\n# High Performance\n\n\n## Concurrency\nFirst and foremost, a `PebbleTemplate` object, once compiled, is completely"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/installation.md",
    "chars": 5329,
    "preview": "---\n---\n\n# Installation & Configuration\n## Installation\nPebble is hosted in the Maven Central Repository. Simply add the"
  },
  {
    "path": "docs/src/orchid/resources/wiki/guide/spring-boot-integration.md",
    "chars": 8138,
    "preview": "---\n---\n\n# Pebble Spring Boot Starter\nSpring Boot starter for autoconfiguring Pebble.\n\n## Basic Usage\nAdd the starter de"
  },
  {
    "path": "docs/src/orchid/resources/wiki/operator/comparisons.md",
    "chars": 385,
    "preview": "# Comparisons\nPebble provides the following comparison operators: `==`, `!=`, `<`, `>`, `<=`, `>=`. All of them except f"
  },
  {
    "path": "docs/src/orchid/resources/wiki/operator/contains.md",
    "chars": 525,
    "preview": "# `contains`\nThe `contains` operator can be used to determine if a collection, map, or array contains a particular item."
  },
  {
    "path": "docs/src/orchid/resources/wiki/operator/is.md",
    "chars": 252,
    "preview": "---\n---\n\n# `is`\nThe `is` operator will apply a test to a variable which will return a boolean.\n\n```twig\n{% verbatim %}\n{"
  },
  {
    "path": "docs/src/orchid/resources/wiki/operator/logic.md",
    "chars": 428,
    "preview": "# Logic\n\nThe `and` operator and the `or` operator are available to join boolean expressions.\n```twig\n{% if 2 is even and"
  },
  {
    "path": "docs/src/orchid/resources/wiki/operator/math.md",
    "chars": 253,
    "preview": "---\n---\n\n# Math\nAll the regular math operators are available for use. Order of operations applies.\n```twig\n{% verbatim %"
  },
  {
    "path": "docs/src/orchid/resources/wiki/operator/others.md",
    "chars": 246,
    "preview": "# Other Operators\nThe `|` operator is used to apply a filter to a variable.\n```twig\n{{ user.name | capitalize }}\n```\nPeb"
  },
  {
    "path": "docs/src/orchid/resources/wiki/summary.md",
    "chars": 2379,
    "preview": "## Guides\n- [Installation and Configuration](guide/installation.md)\n- [Spring Boot Integration](guide/spring-boot-integr"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/autoescape.md",
    "chars": 649,
    "preview": "---\n---\n\n# `autoescape`\n\nThe `autoescape` tag can be used to temporarily disable/re-enable the autoescaper as well as ch"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/block.md",
    "chars": 1103,
    "preview": "---\n---\n\n# `block`\nThe `block` tag performs two functions. If used in a parent template, it will designate a section as "
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/cache.md",
    "chars": 625,
    "preview": "# `cache`\n\nCache the rendering portion of a page. Cache name can be an expression or a static string. It uses the cache "
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/embed.md",
    "chars": 3531,
    "preview": "---\n---\n\n# `embed`\n\nThe `embed` tag allows you to insert the rendered output of another template directly into the curre"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/extends.md",
    "chars": 1824,
    "preview": "# `extends`\nThe `extends` tag is used to declare a parent template. It should be the very first tag used in a child\ntemp"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/filter.md",
    "chars": 308,
    "preview": "# `filter`\n\nThe `filter` tag allows you to apply a filter to a large chunk of template.\n```twig\n{% filter upper %}\n\thell"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/flush.md",
    "chars": 157,
    "preview": "# `flush`\nThe `flush` tag allows you to flush all currently rendered output to the provided `Writer`.\n\n```twig\n{{ header"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/for.md",
    "chars": 1061,
    "preview": "# `for`\n\nThe `for` tag is used to iterate through primitive arrays or anything that implements the `java.lang.Iterable`\n"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/from.md",
    "chars": 184,
    "preview": "---\n---\n\n# `from`\nThe from tag imports {{ anchor('macro') }} names into the current namespace. The tag is documented in "
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/if.md",
    "chars": 687,
    "preview": "---\n---\n\n# `if`\nThe `if` tag allows you to designate a chunk of content as conditional depending on the result of an exp"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/import.md",
    "chars": 1383,
    "preview": "---\n---\n\n# `import`\nThe `import` tag allows you to use {{ anchor('macros', 'macro') }} defined in another template.\n\nAss"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/include.md",
    "chars": 854,
    "preview": "# `include`\n\nThe `include` tag allows you to insert the rendered output of another template directly into the\ncurrent te"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/macro.md",
    "chars": 1505,
    "preview": "---\n---\n\n# `macro`\nThe `macro` tag allows you to create a chunk of reusable and dynamic content. The macro can be called"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/parallel.md",
    "chars": 603,
    "preview": "---\n---\n\n# `parallel`\nThe `parallel` tag allows you to designate a chunk of content to be rendered using a new thread.\nT"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/set.md",
    "chars": 170,
    "preview": "# `set`\nThe `set` tag allows you to define a variable in the current context, whether it currently exists or not.\n```twi"
  },
  {
    "path": "docs/src/orchid/resources/wiki/tag/verbatim.md",
    "chars": 674,
    "preview": "# `verbatim`\nThe `verbatim` tag allows you to write a block of Pebble syntax that won't be parsed.\n```twig\n{% verbatim %"
  },
  {
    "path": "docs/src/orchid/resources/wiki/test/empty.md",
    "chars": 205,
    "preview": "# `empty`\nThe `empty` test checks if a variable is empty. A variable is empty if it is null, an empty string, an\nempty c"
  },
  {
    "path": "docs/src/orchid/resources/wiki/test/even.md",
    "chars": 102,
    "preview": "# `even`\nThe `even` test checks if an integer is even.\n```twig\n{% if 2 is even %}\n\t...\n{% endif %}\n```"
  },
  {
    "path": "docs/src/orchid/resources/wiki/test/iterable.md",
    "chars": 182,
    "preview": "# `iterable`\nThe `iterable` test checks if a variable implements `java.lang.Iterable`.\n```twig\n{% if users is iterable %"
  },
  {
    "path": "docs/src/orchid/resources/wiki/test/map.md",
    "chars": 148,
    "preview": "# `map`\nThe `map` test checks if a variable is an instance of a map.\n```twig\n{% if {\"apple\":\"red\", \"banana\":\"yellow\"} is"
  },
  {
    "path": "docs/src/orchid/resources/wiki/test/null.md",
    "chars": 112,
    "preview": "# `null`\n\nThe `null` test checks if a variable is null.\n```twig\n{% if user.email is null %}\n\t...\n{% endif %}\n```"
  },
  {
    "path": "docs/src/orchid/resources/wiki/test/odd.md",
    "chars": 98,
    "preview": "# `odd`\nThe `odd` test checks if an integer is odd.\n```twig\n{% if 3 is odd %}\n\t...\n{% endif %}\n```"
  },
  {
    "path": "intellij-java-google-style.xml",
    "chars": 21928,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<code_scheme name=\"GoogleStyle\">\n  <option name=\"OTHER_INDENT_OPTIONS\">\n    <valu"
  },
  {
    "path": "pebble/pom.xml",
    "chars": 4463,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/PebbleEngine.java",
    "chars": 19786,
    "preview": "/*\n * This file is part of Pebble.\n * <p>\n * Copyright (c) 2014 by Mitchell Bösecke\n * <p>\n * For the full copyright and"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/ArrayResolver.java",
    "chars": 1381,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.error.AttributeNotFoundException;\nimport"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/AttributeResolver.java",
    "chars": 1154,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.node.ArgumentsNode;\nimport io.pebbletemp"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/DefaultAttributeResolver.java",
    "chars": 3870,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.pebblet"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/ListResolver.java",
    "chars": 1347,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.error.AttributeNotFoundException;\nimport"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/MacroResolver.java",
    "chars": 895,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.node.ArgumentsNode;\nimport io.pebbletemp"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/MapResolver.java",
    "chars": 2455,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.error.AttributeNotFoundException;\nimport"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/MemberCacheUtils.java",
    "chars": 8465,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\nimport io.pebbletemplates.pebble.error.ClassAccessException;\nimport io.pe"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/ResolvedAttribute.java",
    "chars": 226,
    "preview": "package io.pebbletemplates.pebble.attributes;\n\npublic final class ResolvedAttribute {\n\n  public final Object evaluatedVa"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/methodaccess/BlacklistMethodAccessValidator.java",
    "chars": 1185,
    "preview": "package io.pebbletemplates.pebble.attributes.methodaccess;\n\nimport java.lang.reflect.AccessibleObject;\nimport java.lang."
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/methodaccess/MethodAccessValidator.java",
    "chars": 201,
    "preview": "package io.pebbletemplates.pebble.attributes.methodaccess;\n\nimport java.lang.reflect.Method;\n\npublic interface MethodAcc"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/attributes/methodaccess/NoOpMethodAccessValidator.java",
    "chars": 275,
    "preview": "package io.pebbletemplates.pebble.attributes.methodaccess;\n\nimport java.lang.reflect.Method;\n\npublic class NoOpMethodAcc"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/CacheKey.java",
    "chars": 1442,
    "preview": "package io.pebbletemplates.pebble.cache;\n\nimport io.pebbletemplates.pebble.node.CacheNode;\n\nimport java.util.Locale;\n\n/*"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/PebbleCache.java",
    "chars": 222,
    "preview": "package io.pebbletemplates.pebble.cache;\n\nimport java.util.function.Function;\n\npublic interface PebbleCache<K, V> {\n\n  V"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/tag/CaffeineTagCache.java",
    "chars": 879,
    "preview": "package io.pebbletemplates.pebble.cache.tag;\n\nimport com.github.benmanes.caffeine.cache.Cache;\nimport com.github.benmane"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/tag/ConcurrentMapTagCache.java",
    "chars": 872,
    "preview": "package io.pebbletemplates.pebble.cache.tag;\n\nimport io.pebbletemplates.pebble.cache.CacheKey;\nimport io.pebbletemplates"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/tag/NoOpTagCache.java",
    "chars": 459,
    "preview": "package io.pebbletemplates.pebble.cache.tag;\n\nimport io.pebbletemplates.pebble.cache.CacheKey;\nimport io.pebbletemplates"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/template/CaffeineTemplateCache.java",
    "chars": 994,
    "preview": "package io.pebbletemplates.pebble.cache.template;\n\nimport com.github.benmanes.caffeine.cache.Cache;\nimport com.github.be"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/template/ConcurrentMapTemplateCache.java",
    "chars": 981,
    "preview": "package io.pebbletemplates.pebble.cache.template;\n\nimport io.pebbletemplates.pebble.cache.PebbleCache;\nimport io.pebblet"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/cache/template/NoOpTemplateCache.java",
    "chars": 511,
    "preview": "package io.pebbletemplates.pebble.cache.template;\n\nimport io.pebbletemplates.pebble.cache.PebbleCache;\nimport io.pebblet"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/error/AttributeNotFoundException.java",
    "chars": 739,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/error/ClassAccessException.java",
    "chars": 644,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/error/LoaderException.java",
    "chars": 477,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/error/ParserException.java",
    "chars": 532,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/error/PebbleException.java",
    "chars": 1658,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/error/RootAttributeNotFoundException.java",
    "chars": 621,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/AbstractExtension.java",
    "chars": 1360,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/AbstractNodeVisitor.java",
    "chars": 4291,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/Extension.java",
    "chars": 2256,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/ExtensionCustomizer.java",
    "chars": 2159,
    "preview": "package io.pebbletemplates.pebble.extension;\n\nimport io.pebbletemplates.pebble.PebbleEngine;\nimport io.pebbletemplates.p"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/ExtensionRegistry.java",
    "chars": 5102,
    "preview": "package io.pebbletemplates.pebble.extension;\n\nimport io.pebbletemplates.pebble.attributes.AttributeResolver;\nimport io.p"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/ExtensionRegistryFactory.java",
    "chars": 2497,
    "preview": "package io.pebbletemplates.pebble.extension;\n\nimport io.pebbletemplates.pebble.extension.core.AttributeResolverExtension"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/Filter.java",
    "chars": 675,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/Function.java",
    "chars": 583,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/NamedArguments.java",
    "chars": 356,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/NodeVisitor.java",
    "chars": 2459,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/NodeVisitorFactory.java",
    "chars": 819,
    "preview": "package io.pebbletemplates.pebble.extension;\n\nimport io.pebbletemplates.pebble.template.PebbleTemplate;\n\n/**\n * The node"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/Test.java",
    "chars": 675,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/AbbreviateFilter.java",
    "chars": 1656,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/AbsFilter.java",
    "chars": 2053,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/AttributeResolverExtension.java",
    "chars": 603,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.attributes.AttributeResolver;\nimport"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Base64DecoderFilter.java",
    "chars": 1478,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.peb"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Base64EncoderFilter.java",
    "chars": 1012,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.peb"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/CapitalizeFilter.java",
    "chars": 1368,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/CoreExtension.java",
    "chars": 10084,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DateFilter.java",
    "chars": 4885,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DefaultFilter.java",
    "chars": 1320,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DefinedTest.java",
    "chars": 687,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.template.EvaluationContext;\nimport i"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/DisallowExtensionCustomizerBuilder.java",
    "chars": 4853,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.extension.Extension;\nimport io.pebbl"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/EmptyTest.java",
    "chars": 1196,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/EvenTest.java",
    "chars": 1135,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/FirstFilter.java",
    "chars": 1449,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/FormatFilter.java",
    "chars": 1319,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/IterableTest.java",
    "chars": 840,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/JoinFilter.java",
    "chars": 2322,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/LastFilter.java",
    "chars": 1421,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/LengthFilter.java",
    "chars": 1476,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.extension.Filter;\nimport io.pebblete"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/LowerFilter.java",
    "chars": 1006,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MacroAndBlockRegistrantNodeVisitor.java",
    "chars": 1082,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MacroAndBlockRegistrantNodeVisitorFactory.java",
    "chars": 675,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.extension.NodeVisitor;\nimport io.peb"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MapTest.java",
    "chars": 801,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MaxFunction.java",
    "chars": 1157,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MergeFilter.java",
    "chars": 4348,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/MinFunction.java",
    "chars": 1155,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Nl2brFilter.java",
    "chars": 2114,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.peb"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/NullTest.java",
    "chars": 800,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/NumberFormatFilter.java",
    "chars": 1825,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/OddTest.java",
    "chars": 1071,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/RangeFunction.java",
    "chars": 3782,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/ReplaceFilter.java",
    "chars": 1544,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.peb"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/ReverseFilter.java",
    "chars": 859,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.extension.Filter;\nimport io.pebblete"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/RsortFilter.java",
    "chars": 1129,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/Sha256Filter.java",
    "chars": 1817,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.peb"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/SliceFilter.java",
    "chars": 4311,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/SortFilter.java",
    "chars": 1412,
    "preview": "/*\n * This file is part of Pebble.\n *\n * Copyright (c) 2014 by Mitchell Bösecke\n *\n * For the full copyright and license"
  },
  {
    "path": "pebble/src/main/java/io/pebbletemplates/pebble/extension/core/SplitFilter.java",
    "chars": 1540,
    "preview": "package io.pebbletemplates.pebble.extension.core;\n\nimport io.pebbletemplates.pebble.error.PebbleException;\nimport io.peb"
  }
]

// ... and 588 more files (download for full content)

About this extraction

This page contains the full source code of the mbosecke/pebble GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 788 files (1.4 MB), approximately 370.2k tokens, and a symbol index with 2946 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!