You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2018/03/18 18:09:09 UTC
[1/2] incubator-freemarker git commit: Forward ported from 2.3-gae:
Additional interpolationSyntax tests
Repository: incubator-freemarker
Updated Branches:
refs/heads/3 9a13687cc -> 782eed0b4
Forward ported from 2.3-gae: Additional interpolationSyntax tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/8093cb61
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/8093cb61
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/8093cb61
Branch: refs/heads/3
Commit: 8093cb612b0c17710f7cc6579c9704e629711b1b
Parents: 9a13687
Author: ddekany <dd...@apache.org>
Authored: Sun Mar 18 18:47:44 2018 +0100
Committer: ddekany <dd...@apache.org>
Committed: Sun Mar 18 18:59:19 2018 +0100
----------------------------------------------------------------------
.../core/InterpolationSyntaxTest.java | 30 +++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8093cb61/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
index 888b5a8..d187bb5 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
@@ -42,6 +42,13 @@ public class InterpolationSyntaxTest extends TemplateTest {
assertOutput(
"${{'x': 1}['x']} #{{'x': 1}['x']} [={'x': 1}['x']]",
"1 #{{'x': 1}['x']} [={'x': 1}['x']]");
+
+ assertOutput("${'a[=1]b'}", "a[=1]b");
+ assertOutput("${'a${1}#{2}b'}", "a1#{2}b");
+ assertOutput("${'a${1}#{2}b[=3]'}", "a1#{2}b[=3]");
+
+ assertOutput("<@r'${1} #{1} [=1]'?interpret />", "1 #{1} [=1]");
+ assertOutput("${'\"${1} #{1} [=1]\"'?eval}", "1 #{1} [=1]");
}
@Test
@@ -60,9 +67,29 @@ public class InterpolationSyntaxTest extends TemplateTest {
assertOutput("[ =1]", "[ =1]");
assertErrorContains("<#if [true][0]]></#if>", "\"]\"", "nothing open");
+
+ setConfiguration(new TestConfigurationBuilder()
+ .tagSyntax(TagSyntax.SQUARE_BRACKET)
+ .interpolationSyntax(InterpolationSyntax.SQUARE_BRACKET)
+ .build());
+ assertOutput("[#if [true][0]]>[/#if]", ">");
+ assertOutput("[=1][=2]${3}", "12${3}");
+ setConfiguration(new TestConfigurationBuilder()
+ .tagSyntax(TagSyntax.ANGLE_BRACKET)
+ .interpolationSyntax(InterpolationSyntax.SQUARE_BRACKET)
+ .build());
assertOutput("[#ftl][#if [true][0]]>[/#if]", ">");
-
+ assertOutput("[#ftl][=1][=2]${3}", "12${3}");
+
assertOutput("[='a[=1]b']", "a1b");
+ assertOutput("[='a${1}#{2}b']", "a${1}#{2}b");
+ assertOutput("[='a${1}#{2}b[=3]']", "a${1}#{2}b3");
+
+ assertOutput("<@r'${1} #{1} [=1]'?interpret />", "${1} #{1} 1");
+ assertOutput("[='\"${1} #{1} [=1]\"'?eval]", "${1} #{1} 1");
+
+ assertErrorContains("[=", "end of file");
+ assertErrorContains("[=1", "unclosed \"[\"");
StringWriter sw = new StringWriter();
new Template(null, "[= 1 + '[= 2 ]' ]", getConfiguration()).dump(sw);
@@ -79,6 +106,7 @@ public class InterpolationSyntaxTest extends TemplateTest {
.build());
assertOutput("[#if [true][0]]t[#else]f[/#if]", "t");
+ assertOutput("[@r'[#if [true][0]]t[#else]f[/#if]'?interpret /]", "t");
}
}
[2/2] incubator-freemarker git commit: Forward ported from 2.3-gae:
\= escape in string literals
Posted by dd...@apache.org.
Forward ported from 2.3-gae: \= escape in string literals
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/782eed0b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/782eed0b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/782eed0b
Branch: refs/heads/3
Commit: 782eed0b4ac12545715580cfe08dbda119ad9871
Parents: 8093cb6
Author: ddekany <dd...@apache.org>
Authored: Sun Mar 18 19:08:22 2018 +0100
Committer: ddekany <dd...@apache.org>
Committed: Sun Mar 18 19:08:22 2018 +0100
----------------------------------------------------------------------
.../core/InterpolationSyntaxTest.java | 4 +++
.../core/util/TemplateLanguageUtilsTest.java | 21 ++++++++++++++-
.../core/util/TemplateLanguageUtils.java | 27 ++++++++++++--------
freemarker-core/src/main/javacc/FTL.jj | 2 +-
4 files changed, 42 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/782eed0b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
index d187bb5..e6b0eeb 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpolationSyntaxTest.java
@@ -91,6 +91,10 @@ public class InterpolationSyntaxTest extends TemplateTest {
assertErrorContains("[=", "end of file");
assertErrorContains("[=1", "unclosed \"[\"");
+ assertOutput("[='[\\=1]']", "[=1]");
+ assertOutput("[='[\\=1][=2]']", "12"); // Usual legacy interpolation escaping glitch...
+ assertOutput("[=r'[=1]']", "[=1]");
+
StringWriter sw = new StringWriter();
new Template(null, "[= 1 + '[= 2 ]' ]", getConfiguration()).dump(sw);
assertEquals("[=1 + \"[=2]\"]", sw.toString());
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/782eed0b/freemarker-core-test/src/test/java/org/apache/freemarker/core/util/TemplateLanguageUtilsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/util/TemplateLanguageUtilsTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/util/TemplateLanguageUtilsTest.java
index aae4699..1e6f171 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/util/TemplateLanguageUtilsTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/util/TemplateLanguageUtilsTest.java
@@ -20,8 +20,11 @@ package org.apache.freemarker.core.util;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertNull;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import org.junit.Test;
@@ -43,8 +46,10 @@ public class TemplateLanguageUtilsTest {
assertEquals("a\\'c\"d", TemplateLanguageUtils.escapeStringLiteralPart("a'c\"d", '\''));
assertEquals("\\n\\r\\t\\f\\x0002\\\\", TemplateLanguageUtils.escapeStringLiteralPart("\n\r\t\f\u0002\\"));
assertEquals("\\l\\g\\a", TemplateLanguageUtils.escapeStringLiteralPart("<>&"));
+ assertEquals("=[\\=]=", TemplateLanguageUtils.escapeStringLiteralPart("=[=]="));
+ assertEquals("[\\=", TemplateLanguageUtils.escapeStringLiteralPart("[="));
}
-
+
@Test
public void testEscapeStringLiteralAll() {
assertFTLEsc("", "", "", "", "\"\"");
@@ -79,6 +84,20 @@ public class TemplateLanguageUtilsTest {
assertEquals(
"'\"\n\b\u0000c><&{\\",
TemplateLanguageUtils.unescapeStringLiteralPart("\\'\\\"\\n\\b\\x0000c\\g\\l\\a\\{\\\\"));
+
+ assertEquals("\nq", TemplateLanguageUtils.unescapeStringLiteralPart("\\x0Aq"));
+ assertEquals("\n\r1", TemplateLanguageUtils.unescapeStringLiteralPart("\\x0A\\x000D1"));
+ assertEquals("\n\r\t", TemplateLanguageUtils.unescapeStringLiteralPart("\\n\\r\\t"));
+ assertEquals("${1}#{2}[=3]", TemplateLanguageUtils.unescapeStringLiteralPart("$\\{1}#\\{2}[\\=3]"));
+ assertEquals("{=", TemplateLanguageUtils.unescapeStringLiteralPart("\\{\\="));
+ assertEquals("\\=", TemplateLanguageUtils.unescapeStringLiteralPart("\\\\="));
+
+ try {
+ TemplateLanguageUtils.unescapeStringLiteralPart("\\[");
+ fail();
+ } catch (GenericParseException e) {
+ assertThat(e.getMessage(), containsString("\\["));
+ }
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/782eed0b/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
index e2e32e4..f06276b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
@@ -53,6 +53,10 @@ import org.apache.freemarker.core.model.impl.JavaMethodModel;
// TODO [FM3] This name won't be good if the template language isn't called "FTL"...
public final class TemplateLanguageUtils {
+ /**
+ * Used to look up if the chars with low code needs to be escaped, but note that it gives bad result for '=', as
+ * there the it matters if it's after '['.
+ */
private static final char[] ESCAPES = createEscapes();
private TemplateLanguageUtils() {
@@ -68,6 +72,7 @@ public final class TemplateLanguageUtils {
escapes['\''] = '\'';
escapes['"'] = '"';
escapes['<'] = 'l';
+ // As '=' is only escaped if it's after '[', we can't handle it here
escapes['>'] = 'g';
escapes['&'] = 'a';
escapes['\b'] = 'b';
@@ -139,10 +144,16 @@ public final class TemplateLanguageUtils {
StringBuilder buf = null;
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
- char escape =
- c < escLn ? ESCAPES[c] :
- c == '{' && i > 0 && isInterpolationStart(s.charAt(i - 1)) ? '{' :
- 0;
+ char escape;
+ if (c == '=') {
+ escape = i > 0 && s.charAt(i - 1) == '[' ? '=' : 0;
+ } else if (c < escLn) {
+ escape = ESCAPES[c]; //
+ } else if (c == '{' && i > 0 && s.charAt(i - 1) == '$') {
+ escape = '{';
+ } else {
+ escape = 0;
+ }
if (escape == 0 || escape == otherQuotation
|| c == '&' && !escapeAmp || c == '<' && !escapeLT || c == '>' && !escapeGT) {
if (buf != null) {
@@ -181,11 +192,6 @@ public final class TemplateLanguageUtils {
}
}
- private static boolean isInterpolationStart(char c) {
- // Find related: [interpolation prefixes]
- return c == '$';
- }
-
/**
* Unescapes a string that was escaped to be part of an FTL string literal. The string to unescape must not include
* the two quotation marks or two apostrophe-quotes that delimit the literal.
@@ -267,7 +273,8 @@ public final class TemplateLanguageUtils {
bidx = idx + 2;
break;
case '{':
- buf.append('{');
+ case '=':
+ buf.append(c);
bidx = idx + 2;
break;
case 'x': {
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/782eed0b/freemarker-core/src/main/javacc/FTL.jj
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/javacc/FTL.jj b/freemarker-core/src/main/javacc/FTL.jj
index 46782d6..531253e 100644
--- a/freemarker-core/src/main/javacc/FTL.jj
+++ b/freemarker-core/src/main/javacc/FTL.jj
@@ -985,7 +985,7 @@ TOKEN:
<#ESCAPED_CHAR :
"\\"
(
- ("n" | "t" | "r" | "f" | "b" | "g" | "l" | "a" | "\\" | "'" | "\"" | "$" | "{")
+ ("n" | "t" | "r" | "f" | "b" | "g" | "l" | "a" | "\\" | "'" | "\"" | "$" | "{" | "=")
|
("x" ["0"-"9", "A"-"F", "a"-"f"])
)