in freemarker-core/src/main/java/freemarker/template/utility/StringUtil.java [472:535]
private static String FTLStringLiteralEnc(String s, char quotation, boolean addQuotation) {
final int ln = s.length();
final char otherQuotation;
if (quotation == 0) {
otherQuotation = 0;
} else if (quotation == '"') {
otherQuotation = '\'';
} else if (quotation == '\'') {
otherQuotation = '"';
} else {
throw new IllegalArgumentException("Unsupported quotation character: " + quotation);
}
final int escLn = ESCAPES.length;
StringBuilder buf = null;
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
char escape;
if (c == '=') {
escape = i > 0 && s.charAt(i - 1) == '[' ? '=' : 0;
} else if (c < escLn) {
escape = ESCAPES[c]; //
} else if (c == '{' && i > 0 && isInterpolationStart(s.charAt(i - 1))) {
escape = '{';
} else {
escape = 0;
}
if (escape == 0 || escape == otherQuotation) {
if (buf != null) {
buf.append(c);
}
} else {
if (buf == null) {
buf = new StringBuilder(s.length() + 4 + (addQuotation ? 2 : 0));
if (addQuotation) {
buf.append(quotation);
}
buf.append(s.substring(0, i));
}
if (escape == 1) {
// hex encoding for characters below 0x20
// that have no other escape representation
buf.append("\\x00");
int c2 = (c >> 4) & 0x0F;
c = (char) (c & 0x0F);
buf.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A'));
buf.append((char) (c < 10 ? c + '0' : c - 10 + 'A'));
} else {
buf.append('\\');
buf.append(escape);
}
}
}
if (buf == null) {
return addQuotation ? quotation + s + quotation : s;
} else {
if (addQuotation) {
buf.append(quotation);
}
return buf.toString();
}
}