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 2015/09/16 19:59:10 UTC
[10/15] incubator-freemarker git commit: Allowed " for quotation in
extended DecimalFormat option assignments.
Allowed " for quotation in extended DecimalFormat option assignments.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/a071995a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/a071995a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/a071995a
Branch: refs/heads/2.3
Commit: a071995ab4f122fb8d20296147747621974f6d59
Parents: 205bcda
Author: ddekany <dd...@apache.org>
Authored: Wed Sep 16 13:43:06 2015 +0200
Committer: ddekany <dd...@apache.org>
Committed: Wed Sep 16 13:43:06 2015 +0200
----------------------------------------------------------------------
.../core/ExtendedDecimalFormatParser.java | 29 ++++++++++----------
.../core/ExtendedDecimalFormatTest.java | 15 ++++++++++
2 files changed, 30 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/a071995a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java b/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
index 1a44ece..0a14126 100644
--- a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
+++ b/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
@@ -318,46 +318,47 @@ class ExtendedDecimalFormatParser {
private String fetchValue() throws ParseException {
int ln = src.length();
int startPos = pos;
- boolean quotedMode = false;
+ char openedQuot = 0;
boolean needsUnescaping = false;
scanUntilEnd: while (pos < ln) {
char c = src.charAt(pos);
- if (c == '\'') {
- if (!quotedMode) {
+ if (c == '\'' || c == '"') {
+ if (openedQuot == 0) {
if (startPos != pos) {
throw new java.text.ParseException(
- "The \"'\" character can only be used for quoting values, "
+ "The " + c + " character can only be used for quoting values, "
+ "but it was in the middle of an non-quoted value.",
pos);
}
- quotedMode = true;
- } else {
- if (pos + 1 < ln && src.charAt(pos + 1) == '\'') {
- pos++; // skip "''" (escaped "'")
+ openedQuot = c;
+ } else if (c == openedQuot) {
+ if (pos + 1 < ln && src.charAt(pos + 1) == openedQuot) {
+ pos++; // skip doubled quote (escaping)
needsUnescaping = true;
} else {
String str = src.substring(startPos + 1, pos);
pos++;
- return needsUnescaping ? unescape(str) : str;
+ return needsUnescaping ? unescape(str, openedQuot) : str;
}
}
} else {
- if (!quotedMode && !Character.isJavaIdentifierPart(c)) {
+ if (openedQuot == 0 && !Character.isJavaIdentifierPart(c)) {
break scanUntilEnd;
}
}
pos++;
} // while
- if (quotedMode) {
+ if (openedQuot != 0) {
throw new java.text.ParseException(
- "The \"'\" quotation wasn't closed when the end of the source was reached.",
+ "The " + openedQuot
+ + " quotation wasn't closed when the end of the source was reached.",
pos);
}
return startPos == pos ? null : src.substring(startPos, pos);
}
- private String unescape(String s) {
- return StringUtil.replace(s, "\'\'", "\'");
+ private String unescape(String s, char openedQuot) {
+ return openedQuot == '\'' ? StringUtil.replace(s, "\'\'", "\'") : StringUtil.replace(s, "\"\"", "\"");
}
private String fetchStandardPattern() {
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/a071995a/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java b/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
index 84ebf52..612b063 100644
--- a/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
+++ b/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
@@ -101,9 +101,17 @@ public class ExtendedDecimalFormatTest {
assertFormatted("0.0;;inf=infinity", Double.POSITIVE_INFINITY, "infinity");
assertFormatted("0.0;;inf='infinity'", Double.POSITIVE_INFINITY, "infinity");
+ assertFormatted("0.0;;inf=\"infinity\"", Double.POSITIVE_INFINITY, "infinity");
assertFormatted("0.0;;inf=''", Double.POSITIVE_INFINITY, "");
+ assertFormatted("0.0;;inf=\"\"", Double.POSITIVE_INFINITY, "");
assertFormatted("0.0;;inf='x''y'", Double.POSITIVE_INFINITY, "x'y");
+ assertFormatted("0.0;;inf=\"x'y\"", Double.POSITIVE_INFINITY, "x'y");
+ assertFormatted("0.0;;inf='x\"\"y'", Double.POSITIVE_INFINITY, "x\"\"y");
+ assertFormatted("0.0;;inf=\"x''y\"", Double.POSITIVE_INFINITY, "x''y");
assertFormatted("0.0;;dec=''''", 1, "1'0");
+ assertFormatted("0.0;;dec=\"'\"", 1, "1'0");
+ assertFormatted("0.0;;dec='\"'", 1, "1\"0");
+ assertFormatted("0.0;;dec=\"\"\"\"", 1, "1\"0");
try {
ExtendedDecimalFormatParser.parse(";;dec=D,", LOC);
@@ -127,6 +135,13 @@ public class ExtendedDecimalFormatTest {
allOf(containsString("quotation"), containsString("closed")));
}
try {
+ ExtendedDecimalFormatParser.parse(";;dec=\"D", LOC);
+ fail();
+ } catch (java.text.ParseException e) {
+ assertThat(e.getMessage(),
+ allOf(containsString("quotation"), containsString("closed")));
+ }
+ try {
ExtendedDecimalFormatParser.parse(";;dec='D'grp=G", LOC);
fail();
} catch (java.text.ParseException e) {