diff --git a/script/configs/temp_exclude_excerpt.yaml b/script/configs/temp_exclude_excerpt.yaml index 2dd229b184cf..3d39abc136bb 100644 --- a/script/configs/temp_exclude_excerpt.yaml +++ b/script/configs/temp_exclude_excerpt.yaml @@ -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 diff --git a/third_party/packages/mustache_template/CHANGELOG.md b/third_party/packages/mustache_template/CHANGELOG.md index 634e9abae3cd..ff2cc81f9ce4 100644 --- a/third_party/packages/mustache_template/CHANGELOG.md +++ b/third_party/packages/mustache_template/CHANGELOG.md @@ -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. diff --git a/third_party/packages/mustache_template/README.md b/third_party/packages/mustache_template/README.md index cf4dab61e4e6..1d03eda6926c 100644 --- a/third_party/packages/mustache_template/README.md +++ b/third_party/packages/mustache_template/README.md @@ -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 + + ```dart import 'package:mustache_template/mustache_template.dart'; -main() { - var source = ''' - {{# names }} -
{{ lastname }}, {{ firstname }}
- {{/ names }} - {{^ names }} -
No names.
- {{/ 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 }} +
{{ lastname }}, {{ firstname }}
+ {{/ names }} + {{^ names }} +
No names.
+ {{/ 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); } ``` @@ -53,55 +55,28 @@ By default all output from `{{variable}}` tags is html escaped, this behaviour c ## 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 + ```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) => '${ctx.renderString().toUpperCase()}'; -t.renderString({'foo': lambda}); // OI -``` - -```dart -var t = Template('{{# foo }}{{bar}}{{/ foo }}'); -var lambda = (LambdaContext ctx) => '${ctx.renderString().toUpperCase()}'; -t.renderString({'foo': lambda, 'bar': 'pub'}); // PUB -``` - + ```dart var t = Template('{{# foo }}{{bar}}{{/ foo }}'); var lambda = (LambdaContext ctx) => '${ctx.renderString().toUpperCase()}'; @@ -110,8 +85,9 @@ t.renderString({'foo': lambda, 'bar': 'pub'}); // PUB 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. + ```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 -``` +``` \ No newline at end of file diff --git a/third_party/packages/mustache_template/example/main.dart b/third_party/packages/mustache_template/example/main.dart new file mode 100644 index 000000000000..c741dc3e216d --- /dev/null +++ b/third_party/packages/mustache_template/example/main.dart @@ -0,0 +1,57 @@ +// ignore_for_file: avoid_print + +import 'package:mustache_template/mustache_template.dart'; + +// #docregion basic-usage +void main() { + var source = ''' + {{# names }} +
{{ lastname }}, {{ firstname }}
+ {{/ names }} + {{^ names }} +
No names.
+ {{/ 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) => '${ctx.renderString().toUpperCase()}'; + print(lt.renderString({'foo': lambda, 'bar': 'pub'})); // PUB + // #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 +} \ No newline at end of file diff --git a/third_party/packages/mustache_template/example/pubspec.yaml b/third_party/packages/mustache_template/example/pubspec.yaml new file mode 100644 index 000000000000..6b991c7089ff --- /dev/null +++ b/third_party/packages/mustache_template/example/pubspec.yaml @@ -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: ../ \ No newline at end of file diff --git a/third_party/packages/mustache_template/pubspec.yaml b/third_party/packages/mustache_template/pubspec.yaml index 8a8bdeae8b94..e1c0175143a4 100644 --- a/third_party/packages/mustache_template/pubspec.yaml +++ b/third_party/packages/mustache_template/pubspec.yaml @@ -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