Skip to content

Commit

Permalink
feat(interpreter): Support runtime include for tags
Browse files Browse the repository at this point in the history
No tag supports runtime includes yet but this opens the door.

Performance: Previously, every `Template` would re-parse but then inline
anything it includes.  Now, we can support parsing once but have to look
up the partial-template during `render`.

BREAKING CHANGE: The include API is different.
  • Loading branch information
epage committed Dec 27, 2018
1 parent 0ef46a1 commit 5a0854f
Show file tree
Hide file tree
Showing 33 changed files with 565 additions and 247 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ Example:
extern crate liquid;

let template = liquid::ParserBuilder::with_liquid()
.build()
.build().unwrap()
.parse("Liquid! {{num | minus: 2}}").unwrap();

let mut globals = liquid::value::Object::new();
Expand Down
15 changes: 12 additions & 3 deletions benches/handlebars_liquid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,19 @@ teams:

#[bench]
fn parse_template(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
b.iter(|| parser.parse(ITERATE));
}

#[bench]
fn render_template(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(ITERATE)
.expect("Benchmark template parsing failed");
Expand All @@ -58,7 +64,10 @@ static LOOP: &'static str = "BEFORE\n{% for this in real%}{{this}}{%endfor%}AFTE

#[bench]
fn large_loop_helper(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(LOOP)
.expect("Benchmark template parsing failed");
Expand Down
10 changes: 8 additions & 2 deletions benches/liquid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,19 @@ static TEXT_ONLY: &'static str = "Hello World";

#[bench]
fn bench_parse_text(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
b.iter(|| parser.parse(TEXT_ONLY));
}

#[bench]
fn bench_render_text(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(TEXT_ONLY)
.expect("Benchmark template parsing failed");
Expand Down
5 changes: 4 additions & 1 deletion benches/tera_bigcontext_liquid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ With that in mind, let’s learn about borrowing.")),
.into_iter()
.collect();

let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(
"
Expand Down
10 changes: 8 additions & 2 deletions benches/tera_template_liquid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ pub fn big_table(b: &mut test::Bencher) {
table.push(liquid::value::Value::array(inner));
}

let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(BIG_TABLE_TEMPLATE)
.expect("Benchmark template parsing failed");
Expand All @@ -41,7 +44,10 @@ static BIG_TABLE_TEMPLATE: &'static str = "<table>

#[bench]
pub fn teams(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(TEAMS_TEMPLATE)
.expect("Benchmark template parsing failed");
Expand Down
25 changes: 20 additions & 5 deletions benches/tera_tera_liquid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,19 @@ product:

#[bench]
fn bench_parsing_basic_template(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
b.iter(|| parser.parse(SIMPLE_TEMPLATE));
}

#[bench]
fn bench_rendering_only_variable(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(VARIABLE_ONLY)
.expect("Benchmark template parsing failed");
Expand All @@ -54,7 +60,10 @@ fn bench_rendering_only_variable(b: &mut test::Bencher) {

#[bench]
fn bench_rendering_basic_template(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(SIMPLE_TEMPLATE)
.expect("Benchmark template parsing failed");
Expand Down Expand Up @@ -103,7 +112,10 @@ fn deep_object() -> liquid::value::Object {

#[bench]
fn access_deep_object(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse("{% for cow in deep_object.foo.bar.goo.moo.cows %}{{cow.temperament}}{% endfor %}")
.expect("Benchmark template parsing failed");
Expand All @@ -116,7 +128,10 @@ fn access_deep_object(b: &mut test::Bencher) {

#[bench]
fn access_deep_object_with_literal(b: &mut test::Bencher) {
let parser = liquid::ParserBuilder::with_liquid().extra_filters().build();
let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.build()
.unwrap();
let template = parser
.parse(
"
Expand Down
91 changes: 0 additions & 91 deletions liquid-compiler/src/include.rs

This file was deleted.

3 changes: 0 additions & 3 deletions liquid-compiler/src/lang.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
use super::BoxedBlockParser;
use super::BoxedTagParser;
use super::BoxedValueFilter;
use super::Include;
use super::PluginRegistry;

#[derive(Clone)]
pub struct Language {
pub blocks: PluginRegistry<BoxedBlockParser>,
pub tags: PluginRegistry<BoxedTagParser>,
pub filters: PluginRegistry<BoxedValueFilter>,
pub include_source: Option<Box<Include>>,
non_exhaustive: (),
}

Expand All @@ -25,7 +23,6 @@ impl Default for Language {
blocks: Default::default(),
tags: Default::default(),
filters: Default::default(),
include_source: None,
non_exhaustive: Default::default(),
}
}
Expand Down
2 changes: 0 additions & 2 deletions liquid-compiler/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ extern crate pest_derive;
mod block;
mod filter;
mod filter_chain;
mod include;
mod lang;
mod parser;
mod registry;
Expand All @@ -19,7 +18,6 @@ mod text;
pub use block::*;
pub use filter::*;
pub use filter_chain::*;
pub use include::*;
pub use lang::*;
pub use parser::*;
pub use registry::*;
Expand Down
10 changes: 2 additions & 8 deletions src/bin/liquid-dbg/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,18 +84,12 @@ fn run() -> Result<()> {
.arg(option("input", "LIQUID").required(true))
.arg(option("output", "TXT"))
.arg(option("context", "YAML"))
.arg(option("include-root", "PATH"))
.get_matches_safe()?;

let root = matches
.value_of("include-root")
.map(path::PathBuf::from)
.unwrap_or_default();

let parser = liquid::ParserBuilder::with_liquid()
.extra_filters()
.include_source(Box::new(liquid::compiler::FilesystemInclude::new(root)))
.build();
.build()
.expect("should succeed without partials");
let template_path = matches
.value_of("input")
.map(path::PathBuf::from)
Expand Down
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
//! ## Example
//! ```rust
//! let template = liquid::ParserBuilder::with_liquid()
//! .build()
//! .build().unwrap()
//! .parse("Liquid! {{num | minus: 2}}").unwrap();
//!
//! let mut globals = liquid::value::Object::new();
Expand Down Expand Up @@ -52,6 +52,7 @@ pub mod value {
}

pub mod filters;
pub mod partials;
pub mod tags;

pub use interpreter::ValueStore;
Expand Down

0 comments on commit 5a0854f

Please sign in to comment.