aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askama/src/lib.rs183
1 files changed, 183 insertions, 0 deletions
diff --git a/askama/src/lib.rs b/askama/src/lib.rs
index dae237d..8cfe79c 100644
--- a/askama/src/lib.rs
+++ b/askama/src/lib.rs
@@ -1,3 +1,186 @@
+//! Askama implements a type-safe compiler for Jinja-like templates.
+//! It lets you write templates in a Jinja-like syntax,
+//! which are linked to a `struct` defining the template context.
+//! This is done using a custom derive implementation (implemented
+//! in [askama_derive](https://crates.io/crates/askama_derive)).
+//!
+//! # Example template
+//!
+//! ```text
+//! {% extends "layout.html" %}
+//! {% block body %}
+//! <ul>
+//! {% for user in users %}
+//! <li><a href="{{ user.url }}">{{ user.username }}</a></li>
+//! {% endfor %}
+//! </ul>
+//! {% endblock %}
+//! ```
+//!
+//! # Feature highlights
+//!
+//! * Construct templates using a familiar, easy-to-use syntax
+//! * Fully benefit from the safety provided by Rust's type system
+//! * Templates do not perform eager conversion to strings or other types
+//! * Template code is compiled into your crate for optimal performance
+//! * Templates can directly access your Rust types, according to Rust's
+//! privacy rules
+//! * Debugging features to assist you in template development
+//! * Included filter functions will provide easy access to common functions
+//! * Templates must be valid UTF-8 and produce UTF-8 when rendered
+//!
+//! # Creating Askama templates
+//!
+//! An Askama template is just a text file, in the UTF-8 encoding.
+//! It can be used to generate any kind of text-based format.
+//! You can use whatever extension you like.
+//!
+//! A template consists of **text contents**, which are passed through as-is,
+//! **expressions**, which get replaced with content while being rendered, and
+//! **tags**, which control the template's logic.
+//! The template syntax is very similar to [Jinja](http://jinja.pocoo.org/),
+//! as well as Jinja-derivatives like [Twig](http://twig.sensiolabs.org/) or
+//! [Tera](https://github.com/Keats/tera).
+//!
+//! ## Variables
+//!
+//! Template variables are defined by the template context linked to the
+//! template by deriving a `struct`'s implementation for `Template` from
+//! a template file's contents.
+//! You can use a dot (`.`) to get a variable's attributes.
+//! Reading from variables is subject to the usual borrowing policies.
+//! For example, `{{ name }}` will get the ``name`` field from the template
+//! context,
+//! while `{{ user.name }}` will get the ``name`` field of the `user`
+//! ``field`` of the template context.
+//!
+//! ## Filters
+//!
+//! Values such as those obtained from variables can be post-processed
+//! using **filters**.
+//! Filters are applied to values using the pipe symbol (`|`) and may
+//! have optional extra arguments in parentheses.
+//! Filters can be chained, in which case the output from one filter
+//! is passed to the next.
+//!
+//! For example, `{{ "{:?}"|format(name|escape) }}` will escape HTML
+//! characters from the value obtained by accessing the `name` field,
+//! and print the resulting string as a Rust literal.
+//!
+//! Consult the [filters module documentation](filters/index.html) for a list
+//! of available filters. User-defined filters are currently not supported.
+//!
+//! ## Whitespace control
+//!
+//! Askama preserves all whitespace in template code by default,
+//! except that final trailing newline characters are suppressed.
+//! However, whitespace before and after expression and block delimiters
+//! can be suppressed by writing a minus sign directly following a
+//! start delimiter or leading into an end delimiter.
+//! Askama considers all tabs, spaces, newlines and carriage returns to be
+//! whitespace.
+//!
+//! ## Template inheritance
+//!
+//! Template inheritance allows you to build a base template with common
+//! elements that can then be shared by all inheriting templates.
+//! A base template defines **blocks** that child templates can then override.
+//!
+//! ### Base template
+//!
+//! ```text
+//! <!DOCTYPE html>
+//! <html lang="en">
+//! <head>
+//! <title>{{ block title %}{{ title }}{% endblock %} - My Site</title>
+//! {% block head %}{% endblock %}
+//! </head>
+//! <body>
+//! <div id="content">
+//! {% block content %}{% endblock %}
+//! </div>
+//! </body>
+//! </html>
+//! ```
+//!
+//! The `block` tags define three blocks that can be filled in by child
+//! templates. The base template defines a default version of the block.
+//!
+//! ### Child template
+//!
+//! Here's an example child template:
+//!
+//! ```text
+//! {% extends "base.html" %}
+//!
+//! {% block title %}Index{% endblock %}
+//!
+//! {% block head %}
+//! <style>
+//! </style>
+//! {% endblock %}
+//!
+//! {% block content %}
+//! <h1>Index</h1>
+//! <p>Hello, world!</p>
+//! {% endblock %}
+//! ```
+//!
+//! The `extends` tag tells the code generator that this template inherits
+//! from another template. It will render the top-level content from the
+//! base template, and substitute blocks from the base template with those
+//! from the child template. The inheriting template context `struct` must
+//! have a field called `_parent` of the type used as the base template
+//! context. Blocks can only refer to the context of their own template.
+//!
+//! ## HTML escaping
+//!
+//! Askama does not yet support automatic escaping. Care must be taken to
+//! escape content that may contain HTML control characters. You can use
+//! the `escape` filter (or its `e` alias) to escape data for use in HTML.
+//!
+//! ## Control structures
+//!
+//! ### For
+//!
+//! Loop over each item in an iterator. For example:
+//!
+//! ```text
+//! <h1>Users</h1>
+//! <ul>
+//! {% for user in users %}
+//! <li>{{ user.name|e }}</li>
+//! {% endfor %}
+//! </ul>
+//! ```
+//!
+//! Inside for-loop blocks, some useful variables are accessible:
+//!
+//! * *loop.index*: current loop iteration (starting from 1)
+//! * *loop.index0*: current loop iteration (starting from 0)
+//!
+//! ### If
+//!
+//! The *if* statement is used as you might expect:
+//!
+//! ```text
+//! {% if users.len() == 0 %}
+//! No users
+//! {% else if users.len() == 1 %}
+//! 1 user
+//! {% else %}
+//! {{ users.len() }} users
+//! {% endif %}
+//! ```
+//!
+//! ## Expressions
+//!
+//! Askama supports string literals (`"foo"`) and integer literals (`1`).
+//! It supports almost all binary operators that Rust supports,
+//! including arithmetic, comparison and logic operators.
+//! The same precedence order as Rust uses is applied.
+//! Expressions can be grouped using parentheses.
+
#[macro_use]
extern crate nom;
extern crate syn;