From 2199e85601c4d10e1416737f787561a75e0b8017 Mon Sep 17 00:00:00 2001 From: Andreas Hager Date: Mon, 28 Nov 2022 06:16:54 +0100 Subject: [PATCH] #189 properly reset escaping context after attribute value --- .../gg/jte/compiler/kotlin/KotlinCodeGenerator.java | 5 +++-- .../kotlin/TemplateEngine_HtmlOutputEscapingTest.java | 10 ++++++++++ .../java/gg/jte/compiler/java/JavaCodeGenerator.java | 5 +++-- .../gg/jte/TemplateEngine_HtmlOutputEscapingTest.java | 10 ++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/jte-kotlin/src/main/java/gg/jte/compiler/kotlin/KotlinCodeGenerator.java b/jte-kotlin/src/main/java/gg/jte/compiler/kotlin/KotlinCodeGenerator.java index cdfe56ba..bdf2db81 100644 --- a/jte-kotlin/src/main/java/gg/jte/compiler/kotlin/KotlinCodeGenerator.java +++ b/jte-kotlin/src/main/java/gg/jte/compiler/kotlin/KotlinCodeGenerator.java @@ -318,6 +318,9 @@ public void onHtmlTagAttributeCodePart(int depth, String codePart, String tagNam kotlinCode.append("jteOutput.setContext(\"").append(tagName).append("\", \"").append(attributeName).append("\")\n"); writeCodePart(depth, codePart); + + writeIndentation(depth + 1); + kotlinCode.append("jteOutput.setContext(\"").append(tagName).append("\", null)\n"); } @Override @@ -420,8 +423,6 @@ public void onHtmlAttributeOutput(int depth, TemplateParser.HtmlTag currentHtmlT onConditionStart(depth, "gg.jte.runtime.TemplateUtils.isAttributeRendered(" + javaExpression + ")"); onTextPart(depth + 1, " " + htmlAttribute.name + "=" + htmlAttribute.quotes); onHtmlTagAttributeCodePart(depth + 1, javaExpression, currentHtmlTag.name, htmlAttribute.name); - writeIndentation(depth + 1); - kotlinCode.append("jteOutput.setContext(\"").append(currentHtmlTag.name).append("\", null)\n"); onTextPart(depth + 1, "" + htmlAttribute.quotes); } onConditionEnd(depth); diff --git a/jte-kotlin/src/test/java/gg/jte/kotlin/TemplateEngine_HtmlOutputEscapingTest.java b/jte-kotlin/src/test/java/gg/jte/kotlin/TemplateEngine_HtmlOutputEscapingTest.java index 2795f030..a8472726 100644 --- a/jte-kotlin/src/test/java/gg/jte/kotlin/TemplateEngine_HtmlOutputEscapingTest.java +++ b/jte-kotlin/src/test/java/gg/jte/kotlin/TemplateEngine_HtmlOutputEscapingTest.java @@ -1372,6 +1372,16 @@ void localization_contentParams() { assertThat(output.toString()).isEqualTo("Hello? Click here"); } + @Test + void localization_contentParams2() { + codeResolver.givenCode("template.kte", "@param localizer:gg.jte.kotlin.TemplateEngine_HtmlOutputEscapingTest.MyLocalizer\n" + + "${localizer.localize(\"link\", @``, @``)}"); + + templateEngine.render("template.kte", TemplateUtils.toMap("localizer", localizer), output); + + assertThat(output.toString()).isEqualTo("Hello? Click here"); + } + @SuppressWarnings("unused") public static class MyLocalizer implements LocalizationSupport { Map resources = TemplateUtils.toMap( diff --git a/jte/src/main/java/gg/jte/compiler/java/JavaCodeGenerator.java b/jte/src/main/java/gg/jte/compiler/java/JavaCodeGenerator.java index b55f2b43..e43aa973 100644 --- a/jte/src/main/java/gg/jte/compiler/java/JavaCodeGenerator.java +++ b/jte/src/main/java/gg/jte/compiler/java/JavaCodeGenerator.java @@ -311,6 +311,9 @@ public void onHtmlTagAttributeCodePart(int depth, String codePart, String tagNam javaCode.append("jteOutput.setContext(\"").append(tagName).append("\", \"").append(attributeName).append("\");\n"); writeCodePart(depth, codePart); + + writeIndentation(depth + 1); + javaCode.append("jteOutput.setContext(\"").append(tagName).append("\", null);\n"); } @Override @@ -413,8 +416,6 @@ public void onHtmlAttributeOutput(int depth, TemplateParser.HtmlTag currentHtmlT onConditionStart(depth, "gg.jte.runtime.TemplateUtils.isAttributeRendered(" + javaExpression + ")"); onTextPart(depth + 1, " " + htmlAttribute.name + "=" + htmlAttribute.quotes); onHtmlTagAttributeCodePart(depth + 1, javaExpression, currentHtmlTag.name, htmlAttribute.name); - writeIndentation(depth + 1); - javaCode.append("jteOutput.setContext(\"").append(currentHtmlTag.name).append("\", null);\n"); onTextPart(depth + 1, "" + htmlAttribute.quotes); } onConditionEnd(depth); diff --git a/jte/src/test/java/gg/jte/TemplateEngine_HtmlOutputEscapingTest.java b/jte/src/test/java/gg/jte/TemplateEngine_HtmlOutputEscapingTest.java index a1ac0c17..3c19c5b4 100644 --- a/jte/src/test/java/gg/jte/TemplateEngine_HtmlOutputEscapingTest.java +++ b/jte/src/test/java/gg/jte/TemplateEngine_HtmlOutputEscapingTest.java @@ -1527,6 +1527,16 @@ void localization_contentParams() { assertThat(output.toString()).isEqualTo("Hello? Click here"); } + @Test + void localization_contentParams2() { + codeResolver.givenCode("template.jte", "@param gg.jte.TemplateEngine_HtmlOutputEscapingTest.MyLocalizer localizer\n" + + "${localizer.localize(\"link\", @``, @``)}"); + + templateEngine.render("template.jte", TemplateUtils.toMap("localizer", localizer), output); + + assertThat(output.toString()).isEqualTo("Hello? Click here"); + } + @SuppressWarnings("unused") public static class MyLocalizer implements LocalizationSupport { Map resources = TemplateUtils.toMap(