Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for escaping raw expressions (TVAR) #1085

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

JonMcPherson
Copy link

@JonMcPherson JonMcPherson commented Nov 29, 2023

Fixes Issue #1084

Escaping raw expressions (TVAR) is supported by Handlebars.js, but Handlebars.java currently only supports escaping normal expressions (VAR). It is a simple fix to also support escaping raw expressions by updating varEscape to first check with the extra curly bracket in the delimiters like start + "{" and end + "}", then otherwise check with the normal start and end delimiters like before. The visitEscape function doesn't need to change since the ignoring behavior is the same, we only care to drop the escape character.

It would be great if this could be merged, and a new version cut and released as soon as possible. This is a big gap in this implementation, and we need it fixed ASAP. Much appreciated!

EDIT: I just noticed that the handlebars spec actually doesn't mention escaping raw expressions, or really much about escaping expressions in general, but I do see that the JS lexer/parser only cares if it starts with \{{, and does not invalidate if it contains more { like the Java implemtation does. So it just works to escape \{{{raw}}} as well as \{{var}}. So I think this should still be merged to at least have parity with the JS implementation.
Additionally, I found a workaround by just wrapping the normally escaped var with curly brackets like converting {{{raw}}} to {/{{raw}}} which achieves the same result.
See here: https://github.com/handlebars-lang/handlebars-parser/blob/master/src/handlebars.l#L46-L47

@@ -87,7 +87,7 @@ public void shouldCompileTo(final String template, final Object context,
throws IOException {
Template t = compile(template, helpers, partials);
String result = t.apply(configureContext(context));
assertEquals("'" + expected + "' should === '" + result + "': " + message, expected, result);
assertEquals("'" + result + "' should === '" + expected + "': " + message, expected, result);
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor fix to the order of arguments so that result should equal expected instead of the other way around


import static org.junit.Assert.assertEquals;

public class Issue1084 extends AbstractTest {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a copy of the Issue294 test suite except uses raw expressions (triple curly brackets)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant