jinja 0.6.1-dev.5 copy "jinja: ^0.6.1-dev.5" to clipboard
jinja: ^0.6.1-dev.5 copied to clipboard

Jinja2 template engine for Dart. Variables, expressions, control structures and template inheritance.

jinja #

Pub Package Test Status CodeCov

Jinja (3.x) server-side template engine port for Dart 2. Variables, expressions, control structures and template inheritance.

Version 0.6.0 introduces breaking changes #

  • FilterArgumentError error class removed
  • *args and **kwargs arguments support removed
  • Auto-escaping and related statements, filters and tests have been removed due to the impossibility of extending String. Use the escape filter manually or escape values before passing them to the template.

For more information, see CHANGELOG.md.

Documentation #

It is mostly similar to Jinja templates documentation, differences provided below.

work in progress.

Differences with Python version #

  • The default filter compares values with null.
  • The defined and undefined tests compare values with null.
  • The map filter also compares values with null. Use attribute and item filters for object.attribute and object[item] expressions.
  • If Environment({getAttribute}) is not passed, the getItem method will be used. This allows you to use {{ map.key }} as an expression equivalent to {{ map['key'] }}.
  • Slices and negative indexes are not supported.
  • Macro arguments without default values are required.
  • Not supported:
    • Template module.
  • work in progress

Dynamically invoked members (can increase the size of the JS output) #

  • [], +, -, *, /, ~/, % operators
  • object.length getter
  • object.call getter
  • Function.apply(function, ...)

Example #

import 'package:jinja/jinja.dart';

// ...

var environment = Environment(blockStart: '...', blockEnd: '...');
var template = environment.fromString('...source...');
print(template.render({'key': value}));
// or write directly to StringSink (IOSink, HttpResponse, ...)
template.renderTo(stringSink, {'key': value});

See also examples with conduit and reflectable.

Status: #

TODO: #

  • Informative error messages
    • Template name 🔥
    • Source span 🔥
  • Template class:
    • generate method
    • stream method
  • Relative template paths
  • Async Support
  • Template Inheritance
    • Super Blocks
      • {{ super.super() }}
  • List of Control Structures
    • Extends
      • Execute non-block statements and expressions
        {% extends 'base.html' %}
        {% set title = 'Index' %}
        {% macro header() %}
          <h1>{{ title }}</h1>
        {% endmacro %}      ```
        {% block body %}
          {{ header() }}
        {% endblock %}
        
  • Expressions
    • Dart Methods and Properties
      • !./?.
  • Loaders
    • PackageLoader (VM)
    • ...
  • List of Global Functions
    • lipsum
    • cycler
    • joiner
  • Extensions
    • i18n
    • Loop Controls
    • Debug Statement
  • Template compiler (builder)
  • ...

Done: #

Note: item - not supported

  • Variables
  • Filters
    • forceescape
    • safe
    • unsafe
  • Tests
    • escaped
  • Comments
  • Whitespace Control
  • Escaping (only escape filter)
  • Line Statements
    • Comments
    • Blocks
  • Template Inheritance
    • Base Template
    • Child Template
    • Super Blocks
    • Nesting extends
    • Named Block End-Tags
    • Block Nesting and Scope
    • Required Blocks
    • Template Objects
  • HTML Escaping
  • List of Control Structures
    • For
    • If
    • Macro
    • Call
    • Filters
    • Assignments
    • Block Assignments
    • Extends
    • Blocks
    • Include
    • Import
  • Import Context Behavior
  • Expressions with filters and tests
    • Literals
      • "Hello World"
      • 42 / 123_456
      • 42.23 / 42.1e2 / 123_456.789
      • ['list', 'of', 'objects']
      • ('tuple', 'of', 'values')
      • {'dict': 'of', 'key': 'and', 'value': 'pairs'}
      • true / false
      • null
    • Math
      • +
      • -
      • /
      • //
      • %
      • *
      • **
    • Comparisons
      • ==
      • !=
      • >
      • >=
      • <
      • <=
    • Logic
      • and
      • or
      • not
      • (expr)
    • Other Operators
      • in
      • is
      • |
      • ~
      • ()
      • ./[]
    • If Expression
      • {{ list.last if list }}
      • {{ user.name if user else 'Guest' }}
    • Dart Methods and Properties (if reflection is on)
      • {{ string.toUpperCase() }}
      • {{ list.add(item) }}
  • List of Global Functions
    • dict
    • print
    • range
    • list
    • namespace
  • Loaders
    • FileSystemLoader
    • MapLoader (DictLoader)
  • Extensions
    • Expression Statement
    • With Statement
  • Autoescape Overrides

Contributing #

Contributions are welcome! Please open an issue or pull request on GitHub. Look at the ToDo list and comments in the code for ideas on what to work on. There are no strict rules, but please try to follow the existing code style.

As non-native English speaker and learner, I will be grateful for any corrections in the documentation and code comments.

Support #

Post issues and feature requests on the GitHub issue tracker.

36
likes
160
pub points
89%
popularity

Publisher

unverified uploader

Jinja2 template engine for Dart. Variables, expressions, control structures and template inheritance.

Repository (GitHub)
View/report issues

Documentation

API reference

Funding

Consider supporting this project:

www.buymeacoffee.com

License

MIT (license)

Dependencies

html_unescape, meta, path, string_scanner, textwrap

More

Packages that depend on jinja