handlebars-rust icon indicating copy to clipboard operation
handlebars-rust copied to clipboard

Extra whitespace added to `each` when the `/each` isn't followed by `\n`

Open jjcomer opened this issue 10 months ago • 1 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.

jjcomer avatar Sep 27 '23 12:09 jjcomer

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

sunng87 avatar Sep 28 '23 02:09 sunng87