Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion script/configs/temp_exclude_excerpt.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@
# https://github.com/flutter/flutter/issues/102679
- espresso
- in_app_purchase/in_app_purchase
- mustache_template
- pointer_interceptor
- quick_actions/quick_actions
6 changes: 6 additions & 0 deletions third_party/packages/mustache_template/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 2.0.5

* Adds example app demonstrating basic variable rendering, sections,
inverted sections, and lambdas.


## 2.0.4

* Fixes a broken README link to the Mustache manual.
Expand Down
82 changes: 29 additions & 53 deletions third_party/packages/mustache_template/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,30 @@ See the [mustache manual](https://mustache.github.io/mustache.5.html) for detail
This library passes all [mustache specification](https://github.com/mustache/spec/tree/master/specs) tests.

## Example usage

<?code-excerpt "example/main.dart (basic-usage)"?>
```dart
import 'package:mustache_template/mustache_template.dart';

main() {
var source = '''
{{# names }}
<div>{{ lastname }}, {{ firstname }}</div>
{{/ names }}
{{^ names }}
<div>No names.</div>
{{/ names }}
{{! I am a comment. }}
''';

var template = Template(source, name: 'template-filename.html');

var output = template.renderString({'names': [
{'firstname': 'Greg', 'lastname': 'Lowe'},
{'firstname': 'Bob', 'lastname': 'Johnson'}
]});

print(output);
void main() {
var source = '''
{{# names }}
<div>{{ lastname }}, {{ firstname }}</div>
{{/ names }}
{{^ names }}
<div>No names.</div>
{{/ names }}
{{! I am a comment. }}
''';

var template = Template(source, name: 'template-filename.html');

var output = template.renderString({'names': [
{'firstname': 'Greg', 'lastname': 'Lowe'},
{'firstname': 'Bob', 'lastname': 'Johnson'}
]});

print(output);
}
```

Expand All @@ -53,55 +55,28 @@ By default all output from `{{variable}}` tags is html escaped, this behaviour c

## Nested paths

<?code-excerpt "example/main.dart (nested-paths)"?>
```dart
var t = Template('{{ author.name }}');
var output = template.renderString({'author': {'name': 'Greg Lowe'}});
var t = Template('{{ author.name }}');
var output = t.renderString({'author': {'name': 'Greg Lowe'}});
```

## Partials - example usage

<?code-excerpt "example/main.dart (partials)"?>
```dart

var partial = Template('{{ foo }}', name: 'partial');

var resolver = (String name) {
if (name == 'partial-name') { // Name of partial tag.
return partial;
}
};
var resolver = (String name) => name == 'partial-name' ? partial : null;

var t = Template('{{> partial-name }}', partialResolver: resolver);

var output = t.renderString({'foo': 'bar'}); // bar

```

## Lambdas - example usage

```dart
var t = Template('{{# foo }}');
var lambda = (_) => 'bar';
t.renderString({'foo': lambda}); // bar
```

```dart
var t = Template('{{# foo }}hidden{{/ foo }}');
var lambda = (_) => 'shown';
t.renderString('foo': lambda); // shown
```

```dart
var t = Template('{{# foo }}oi{{/ foo }}');
var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>';
t.renderString({'foo': lambda}); // <b>OI</b>
```

```dart
var t = Template('{{# foo }}{{bar}}{{/ foo }}');
var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>';
t.renderString({'foo': lambda, 'bar': 'pub'}); // <b>PUB</b>
```

<?code-excerpt "example/main.dart (lambdas)"?>
```dart
var t = Template('{{# foo }}{{bar}}{{/ foo }}');
var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>';
Expand All @@ -110,8 +85,9 @@ t.renderString({'foo': lambda, 'bar': 'pub'}); // <b>PUB</b>

In the following example `LambdaContext.renderSource(source)` re-parses the source string in the current context, this is the default behaviour in many mustache implementations. Since re-parsing the content is slow, and often not required, this library makes this step optional.

<?code-excerpt "example/main.dart (lambda-render-source)"?>
```dart
var t = Template('{{# foo }}{{bar}}{{/ foo }}');
var lambda = (LambdaContext ctx) => ctx.renderSource(ctx.source + ' {{cmd}}');
t.renderString({'foo': lambda, 'bar': 'pub', 'cmd': 'build'}); // pub build
```
```
57 changes: 57 additions & 0 deletions third_party/packages/mustache_template/example/main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// ignore_for_file: avoid_print

import 'package:mustache_template/mustache_template.dart';

// #docregion basic-usage
void main() {
var source = '''
{{# names }}
<div>{{ lastname }}, {{ firstname }}</div>
{{/ names }}
{{^ names }}
<div>No names.</div>
{{/ names }}
{{! I am a comment. }}
''';

var template = Template(source, name: 'template-filename.html');

var output = template.renderString({'names': [
{'firstname': 'Greg', 'lastname': 'Lowe'},
{'firstname': 'Bob', 'lastname': 'Johnson'}
]});

print(output);
// #enddocregion basic-usage

// #docregion nested-paths
var t = Template('{{ author.name }}');
var nestedOutput = t.renderString({'author': {'name': 'Greg Lowe'}});
print(nestedOutput);
// #enddocregion nested-paths

// #docregion partials
var partial = Template('{{ foo }}', name: 'partial');

var resolver = (String name) => name == 'partial-name' ? partial : null;

var pt = Template('{{> partial-name }}', partialResolver: resolver);

var partialOutput = pt.renderString({'foo': 'bar'}); // bar
print(partialOutput);
// #enddocregion partials

// #docregion lambdas
var lt = Template('{{# foo }}{{bar}}{{/ foo }}');
var lambda = (LambdaContext ctx) => '<b>${ctx.renderString().toUpperCase()}</b>';
print(lt.renderString({'foo': lambda, 'bar': 'pub'})); // <b>PUB</b>
// #enddocregion lambdas

// #docregion lambda-render-source
var rst = Template('{{# foo }}{{bar}}{{/ foo }}');
var renderSourceLambda = (LambdaContext ctx) =>
ctx.renderSource(ctx.source + ' {{cmd}}');
print(rst.renderString(
{'foo': renderSourceLambda, 'bar': 'pub', 'cmd': 'build'})); // pub build
// #enddocregion lambda-render-source
}
10 changes: 10 additions & 0 deletions third_party/packages/mustache_template/example/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: mustache_template_example
description: Example for mustache_template package.
publish_to: none

environment:
sdk: ^3.9.0

dependencies:
mustache_template:
path: ../
2 changes: 1 addition & 1 deletion third_party/packages/mustache_template/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: mustache_template
description: A templating library that implements the Mustache template specification
repository: https://github.com/flutter/packages/tree/main/third_party/packages/mustache_template
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+mustache_template%22
version: 2.0.4
version: 2.0.5

environment:
sdk: ^3.9.0
Expand Down