sunng87 / handlebars-rust

Rust templating with Handlebars

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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.