Extra whitespace added to `each` when the `/each` isn't followed by `\n`
jjcomer opened this issue · comments
We noticed this issues when upgrading to 4.x
. If an /each
is not followed by a \n
the rendered template will contain extra whitespace. This throws off formats which expect consistent whitespace.
Here is a repro:
#[test]
fn no_newline_for_each() {
let reg = Registry::new();
let tpl = r#"<ul>
{{#each a}}
{{!-- comment --}}
<li>{{this}}</li>
{{/each}}"#;
assert_eq!(
r#"<ul>
<li>0</li>
<li>1</li>
<li>2</li>"#,
reg.render_template(tpl, &json!({"a": [0, 1, 2]})).unwrap()
);
}
Using the template:
r#"<ul>
{{#each a}}
{{!-- comment --}}
<li>{{this}}</li>
{{/each}}"#
Results in:
---- helpers::helper_each::test::no_newline_for_each stdout ----
thread 'helpers::helper_each::test::no_newline_for_each' panicked at 'assertion failed: `(left == right)`
left: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>"`,
right: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>\n "`', src/helpers/helper_each.rs:620:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Using the template:
r#"<ul>
{{#each a}}
{{!-- comment --}}
<li>{{this}}</li>
{{/each}}aa"#
Results in:
---- helpers::helper_each::test::no_newline_for_each stdout ----
thread 'helpers::helper_each::test::no_newline_for_each' panicked at 'assertion failed: `(left == right)`
left: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>"`,
right: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>\n aa"`', src/helpers/helper_each.rs:620:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Using the template:
r#"<ul>
{{#each a}}
{{!-- comment --}}
<li>{{this}}</li>
{{/each}}a
"#;
Results in:
-- helpers::helper_each::test::no_newline_for_each stdout ----
thread 'helpers::helper_each::test::no_newline_for_each' panicked at 'assertion failed: `(left == right)`
left: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>"`,
right: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>\n a\n"`', src/helpers/helper_each.rs:621:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Using the template:
r#"<ul>
{{#each a}}
{{!-- comment --}}
<li>{{this}}</li>
{{/each}}
"#
Results in:
---- helpers::helper_each::test::no_newline_for_each stdout ----
thread 'helpers::helper_each::test::no_newline_for_each' panicked at 'assertion failed: `(left == right)`
left: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>"`,
right: `"<ul>\n <li>0</li>\n <li>1</li>\n <li>2</li>\n"`', src/helpers/helper_each.rs:621:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
As long as the /each
is followed by a \n
we get predictable whitespace.
Thank you for reporting. I can reproduce this issue with 4.x and 5.0 beta.
links for comparing with javascript version:
- https://sunng87.github.io/handlebars-rust/?tpl=%3Cul%3E%0A%20%20%7B%7B%23each%20a%7D%7D%0A%20%20%20%20%3Cli%3E%7B%7Bthis%7D%7D%3C%2Fli%3E%0A%20%20%7B%7B%2Feach%7D%7D&data=%7B%22a%22%3A%20%5B1%2C%202%5D%7D
- https://sunng87.github.io/handlebars-rust/?tpl=%3Cul%3E%0A%20%20%7B%7B%23each%20a%7D%7D%0A%20%20%20%20%3Cli%3E%7B%7Bthis%7D%7D%3C%2Fli%3E%0A%20%20%7B%7B%2Feach%7D%7Da&data=%7B%22a%22%3A%20%5B1%2C%202%5D%7D