ructe 0.13.4

Rust Compiled Templates, efficient type-safe web page templates.
Documentation
# Changelog

All notable changes to this project will be documented in this file.

The format is based on
[Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
project adheres to
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Release 0.13.4 - 2021-06-25

* Allow `else if` after an `@if` block in templates. PR #104, fixes #81.
* Add a missing `}` in doc example.  PR #102.
* Update optional rsass to 0.22.0.
* Updated gotham example to 0.6.0.

Thanks @bearfrieze for #102 and @Aunmag for #81.

Tested with rustc 1.53.0, 1.48.0, 1.46.0, 1.44.1, 1.54.0-beta.1,
and 1.55.0-nightly (7c3872e6b 2021-06-24).


## Release 0.13.2 - 2021-03-14

* Improve formatting of README, PR #100.
* Update nom to 6.1.0, which raises the MSRV to 0.44
* Update base64 to 0.13 and itertools to 0.10.
* Update optional rsass to 0.19.0.
* Add warp 0.3 feature and example.
* Add tide 0.16 feaure and update example.
* Testing is now done with github actions rather than Travis CI.
* Minor clippy fixes, PR #99.

Thanks to @ibraheemdev for PR #100.

Tested with rustc 1.50.0 (cb75ad5db 2021-02-10),
1.48.0 (7eac88abb 2020-11-16),
1.46.0 (04488afe3 2020-08-24),
1.44.1 (c7087fe00 2020-06-17),
1.51.0-beta.6 (6a1835ad7 2021-03-12),
1.52.0-nightly (acca81892 2021-03-13)


## Release 0.13.0 - 2020-11-15

* Try to improve incremental compile times of projects using ructe by
  only writing fils if their contents actually changed. Also some code
  cleanup. PR #97.
* Update ructe itself to use edition 2018 (it is still useable for
  projects using both editios).  PR #98.
* Fix `StaticFiles::add_files_as` for empty `to` argument and add some
  more documentation for it.  Fixes issue #96.
* Update optional rsass dependency to 0.16.0.
* Add optional support for tide 0.14 and 0.15.
* Update gotham to 0.5 and axtix-web to 3.2 in examples.

Tested with rustc 1.47.0 (18bf6b4f0 2020-10-07),
1.42.0 (b8cedc004 2020-03-09), 1.40.0 (73528e339 2019-12-16),
1.48.0-beta.8 (121901459 2020-11-08), and
1.50.0-nightly (98d66340d 2020-11-14)


## Release 0.12.0 - 2020-08-14

* PR #80 and #94: Support Tide framework by a feature and an example.
* PR #91: Update basic examples to edition 2018.
* Issue #68, PR #90: Don't eat whitespace after a for loop.
* Issue #66, PR #89: Fix parse error for nested braces in expressions.
* PR #84: Use std::ascii::escape_default.
* PR #87: Provide ToHtml::to_buffer()
* Forbid unsafe and undocumented code.
* The build is on https://travis-ci.com/kaj/ructe now.
* Internal cleanup.

## Release 0.11.4 - 2020-04-25

* Improve `@match` parsing.

## Release 0.11.2 - 2020-04-22

* Bugfix: Allow space before laste brace in `@match`.

## Release 0.11.0 - 2020-04-21

* PR #73, Issue #38: Add support for `@match` statements.

Thanks to @vivlim for the issue.

## Release 0.10.0 - 2020-04-19

* Update rsass to 0.13.0 and improve sass error handling.
* Drop the warp01 feature.
* PR #72 from @kornelski: Avoid clobbering variable name.
* Update itertools to 0.9.0 and base64 to 0.12.0.

Thanks to @kornelski for suggestions and bug reports.


## Release 0.9.2 - 2020-01-25

* PR #70, Issue #63: Add feature warp02, supportig warp 0.2.x, and add
  a name alias warp01 for the old warp 0.1.x feature.  Same in
  examples.
* PR #69, Issue #67: Anyting that is allowed in a string in Rust
  should be allowed in a string in ructe.
* Fix clippy complaints re statics in generated code.
* Update actix-web example to 2.0.
* Fix doctest with mime03 feature.

Thanks to @nocduro and @Aunmag for suggestions and bug reports.


## Release 0.9.0 - 2019-12-25

* PR #65, Issue #64: An expression starting with paren ends on close.
  BREAKING: Before this change, calling a function on the result of
  some subexpression could be written as `@(a - b).abs()`.  After this
  change, that should be changed to `@((a - b).abs())` unless the
  intent is to have the result of (a - b) followed by the template
  string `.abs()`.
* RucteError now implements std::error::Error.
* Specify which references in examples are `dyn` or `impl`.
* Remove a useless string clone.
* Update rsass to 0.12.0.

Thanks to @Aunmag.


## Release 0.8.0 - 2019-11-06

* Issue #62: New version number due to a semver-breaking change,
  reported by @kornelski.

Otherwise same as 0.7.4:

* PR #55 from kornelski: Improve benchmarks.
* Part of issue #20: Allow template source files to be named *.rs.svg
  or *.rs.xml as well as *.rs.html.  The generated template functions
  will simlilarly be suffixed _svg, _xml or _html (any template_html
  will get a template alias, for backwards compatibility.
* PR #61 from Eroc33: Improve parsing for tuple and generic type
  expressions.
* Fix old doc link in readme.
* Update dependencies in ructe and examples.

Thaks to @kornelski and @Eroc33.


## Redacted: Relase 0.7.4 - 2019-11-02

* PR #55 from kornelski: Improve benchmarks.
* Part of issue #20: Allow template source files to be named
  `*.rs.svg` or `*.rs.xml` as well as `*.rs.html`.  The generated
  template functions will simlilarly be suffixed `_svg`, `_xml` or
  `_html` (any `template_html` will get a `template` alias, for
  backwards compatibility.
* PR #61 from @Eroc33: Improve parsing for tuple and generic type
  expressions.
* Fix old doc link in readme.
* Update dependencies in ructe and examples.

Thaks to @kornelski and @Eroc33.


## Release 0.7.2 - 2019-08-28

* Issue #53, PR #60: Allow empty strings everywhere quoted strings are
  allowed.
* Issue #57, PR #59: Accept explicit impl and dyn in types.
* Relax over-strict whitespace requirements, fix a regression in 0.7.0.
* PR #56: Require buf reference to implement Write, not buf itself
* PR #58: Fix warnings in generated code.
* Remove no-longer-used imports.

Thanks to @kornelski for multiple contributions.


## Release 0.7.0 - 2019-07-18

* PR #52: Upgrade nom to 5.0
* Update rsass to 0.11.0 (which also uses nom 5.0)
* Improve template declaration parsing and diagnostics.
* PR #50 and #51 from @dkotrada: Fix typos in actix example.
* Remove deprecated functions.


## Release 0.6.4 - 2019-06-23

* Added more modern rust compiler versions (and dropped 1.26).
* PR #49: Add an actix example.
* PR #48 from @Noughmad: Use `impl Write` or generic argument instead
  of dynamic traits. Fixes a warning for each template when using
  edition 2018 in nightly rust.
* Clearer doc about escaping special characters.
* PR #46 from @kornelski: Add missing crates keyword


## Release 0.6.2 - 2019-03-16

* Improved documentation and examples.
  All public items now have documentation.
* Improve build-time error handling.
  If there is an error involving an environment variable, include the
  variable name in the message.
* Take more Path build-time arguements AsRef.
  Make it possible to simpl use a string literal as a path in more places.


## Release 0.6.0 - 2019-03-14

* PR #45: Provide a warp feature.
  All my warp + ructe projects use the same RenderRucte extension trait
  to make calling the templates on generating responses a bit clearer.
  Provide that trait here as an optional feature.
* PR #43: Make the build scripts nicer.
  Provide a struct Ructe with methods to handle the red tape from build
  scripts.  Make the remaining parts of the build scripts shorter and
  more to the point.
* Use edition 2018 in warp example.
* Fix examples lang attribute.
  A whole bunch of examples had the html lang attibute set to sv when
  the content is actually in English.


## Release 0.5.10 - 2019-02-22

* Convert more file names to rust names (a file name might contain
  dashes and dots that needs to be converted to something else
  (underscore) to work in a rust name).
* Find new files in static dirs (add a cargo:rerun-if-changed line
  for the directory itself).


## Release 0.5.8 - 2019-02-16

* Adapt to rsass 0.9.8 (the sass feature now requires a compiler that
  supports edition 2018).
* More compact static data, using byte strings instead of numbers.
  (i.e. b"\xef\xbb\xbfabc" rather than [239, 187, 191, 65, 66, 67]).
* Minor internal cleanup.
* Update bytecount dependency.


## Release 0.5.6 - 2019-01-05

* PR #41: Benchmark and improve performance of html-escaping.
* PR #39: Silence a clippy warning about old syntax in silencing
  another warning.
* Update itertools to 0.8 (and env_logger in warp example)

Thanks to @kornelski for PRs #39 and #41.


## Release 0.5.4 - 2018-11-30

* Support struct unpacking in `@if` and `@for` expressions.


## Release 0.5.2 - 2018-11-04

* Special case for empty sub-templates, mainly to avoid a warning when
  compiling generated code.
* Update md5 to 0.6.
* Update gotham in example to 0.3.0.
* Use mime 0.3 in static example, and remove mime03 example.


## Release 0.5.0 - 2018-11-03

* Support multiple Content arguments.
  Impl Trait is used to make sub-templates as arguments less magic.
  This way we can also support more than one Content argument to the
  same template.
* PR #36 / Issue #35: Test and fix support for edition=2018.
  Module paths used by generated code are now compatible with the 2018
  edition.  Also, some code in examples and documentation use more
  2018-friendly module paths.
* PR 34: Use bytecount rather than simple counting, elide one lifetime.
* Update nom to 4.1.1, base64 to 0.10.0, bytecount to 0.4, and md5 to 0.5.
* Update iron to 0.6 and warp to 0.1.9 in examples.
* Minor cleanup in nickel example.

Thanks to @KlossPeter for PR #34 and @matthewpflueger for issue #35.


## Release 0.4.6 - 2018-10-07

* Lock nom version at 4.0, since it seems the 4.1 release is
  incompatible with the error handling in ructe.


## Release 0.4.4 - 2018-09-06

* Test and fix #33, unduplicate curly brackets.
* Add `@@` escape, producing a single `@` sign.  Suggested in #33.
* Some more mime types for static files.
* Update dependencies: nom 4.0, rsass 0.9.0
* Add a warp example, and link to kaj/warp-diesel-ructe-sample

Thanks to @dermetfan for reporting issue #33.


## Release 0.4.2 - 2018-08-01

* Test and fix issue #31, comments in body.

Thanks to @jo-so for reporting the issue, and for the test


## Release 0.4.0 - 2018-07-05

* Template syntax:
  - Allow local ranges (i.e. `2..7`) in loop expressions.
  - Allow underscore rust names.  There is use for unused variables in
    templates, so allow names starting with underscore.
  - Issue #24 / PR #28: Allow logic operators in `@if ...` expressions.
  - Issue #25 / PR #27: Allow much more in parentehsis expressions.

* Improved examples:
  - A new design for the framework examples web page, using svg graphics.
  - Improve code and inline documentation of iron and nickel examples.
  - Add a similar example with the Gotham framework.

* Recognize `.svg` static files.
* Allocate much fewer strings when parsing expressions in templates.
* PR #26: use `write_all` rather than the `write!` macro in generated
  code, contributed by @kornelski
* Fix `application/octet-stream` MIME type.  Contributed by @kornelski.
* Use `write_str`/`write_all` when generating output.  Contributed by
  @kornelski.


## Release 0.3.16 - 2018-04-08

Changes since 0.3.14 is mainly some internal cleanup, a link fix in
README and the optional rsass dependency is updated to 0.8.0.


## Release 0.3.14 - 2018-03-11

* Make the space after a comma in list expressions optional.
* Allow enum variants (and module names) in expressions.
* Some cleanup in parser code.


## Release 0.3.12 - 2018-02-10

* Add a way to add static files without hashnames.
  A static file can be added and mapped as an arbitrary name, or a
  directory can be recursively added with an arbitrary prefix.


## Release 0.3.10 - 2017-12-30

* Allow `*` at start of expressions (and subexpressions).
* Updated (optional) rsass to ^0.7.0.
* Updated base64 to ^0.9.0.


## Release 0.3.8 - 2017-12-07

* Make clippy happy with the code genarated for templates.
* Updated lazy_static to 1.0.
* Updated base64 to 0.8.
* Updated (optional) rsass to 0.6.


## Relese 0.3.6 - 2017-11-05

* Update nom dependency to version 3.2.
* Update optional rsass dependency to version 0.5.0.
* Update base64 dependency to 0.7.0.
* A documentation typo fixed, by @jo-so.
* Minor internal cleanup.


## Release 0.3.4 - 2017-07-10

* PR #15, issue #14: Allow destructure in loops, thanks to @nubis.
* PR #16 Allow complex argument types to templates
* PR #17 Write a doc chapter about static content.


## Release 0.3.2 - 2017-06-23

* Fix a bug in ordering (and therefor findability) of static files.
* Improved documentation.
* PR #13: Provide mime type for static file data.
* Fix file paths for `@import` in scss (using sass feature).
* Code cleanup (use `?` operator rather than `try!` macro).
* Use include_bytes for static files to improve compile times.


## Release 0.3.0 - 2017-05-07

* Issue #10: Watch template directories for changes, to build new
  templates when they are created.
* PR #12: Integrate sass, including a function to reference static
  files from a scss document.
* Some documentation improvements and internal code cleanup.


## Release 0.2.6 - 2017-03-23

* #8 / PR #11: Much improved error reporting.
* #9 allow comparison operators in if statements.
* Improved documentation, including a chapter on template structure in
  the docs (based on what was in the README.md).

This release is tested with rust versions 1.14.0, 1.15.1, 1.16.0
(stable), 1.17.0-beta.2 (b7c276653 2017-03-20), and 1.17.0-nightly
(8c4f2c64c 2017-03-22).


## Release 0.2.4 - 2017-02-05

* Test: expression may be in string, such as `<a href="@foo">...</a>`.
  This should work for all expressions.
* Handle escaped quotes in strings.
* PR #7: Allow slices in templates.
* Stop using the nom macro chain!, which is deprecated.

This release is tested with rust versions 1.14.0, 1.15.0 (stable),
1.16.0-beta.1 (beta), and 1.17.0-nightly (0648517fa 2017-02-03).


## Release 0.2.2 - 2017-01-29

* PR #3: Add convenient handling of static files
* Add documentation for utilities.


## Release 0.2.0 - 2017-01-28

* PR #6, Issue #5: Template directory structure.  Finds templates in
  all subdirectories of the template dir rather than only the template
  dir itself.  Template functions are created in a module structure
  that mirrors the directory structure.
  Thanks to @mrLSD for suggestion.
* Update `nom` to 2.0
* Use `base64` instead of entire `rustc_serialize` for just base64 coding.
* Issue #4: Mention curly brackets escaping in docs.  Thanks to @dermetfan.
* Cleanup, more tests and documentation.


## Release 0.1.2 - 2016-11-20

* Allow expressions to start with boolean not.
* DRYer test code.
* Write the generated code for each template into a separate file.
  As suggested by Jethro Beekman in
  [a comment on my blog]https://rasmus.krats.se/2016/ructe.en#c2427.
* More calling templates from templates doc.


## Release 0.1.1 - 2016-10-03

* Support calling templates with body arguments. Usefull for
  "base-page" templates.
* Provide `Html` trait to template code.
* Some testing and cleanup.


## Version 0.1.0 - 2016-09-24

* First version published on crates.io.
* Support for `@if` and `@for` blocks.
* Improved expression parsing with chaining, square and curly brakets,
  and string literals.
* Compile all found templates.
* More tests and documentation.


## Initial commit - 2016-09-14

Very siple templates, with arguments, worked, and text was
html-escaped as needed.