X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fresources%2FBundleHelper.java;h=0d48d67a0d031b8b4902e5536fd696b965fdf8b7;hb=b15a49851835d45d35ba9fdd28521df34021828f;hp=39c00c5c6079e5791a62ae73b2c38535d0ffb371;hpb=13bfeea6ce8894711317f8259b143984210be0c4;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/resources/BundleHelper.java b/src/be/nikiroo/utils/resources/BundleHelper.java index 39c00c5..0d48d67 100644 --- a/src/be/nikiroo/utils/resources/BundleHelper.java +++ b/src/be/nikiroo/utils/resources/BundleHelper.java @@ -267,19 +267,25 @@ class BundleHelper { char car = str.charAt(i); if (prevIsBackSlash) { + // We don't process it here builder.append(car); prevIsBackSlash = false; } else { switch (car) { case '"': + // We don't process it here + builder.append(car); + if (inQuote) { - list.add(builder.toString()); + list.add(unescape(builder.toString())); builder.setLength(0); } inQuote = !inQuote; break; case '\\': + // We don't process it here + builder.append(car); prevIsBackSlash = true; break; case ' ': @@ -333,9 +339,83 @@ class BundleHelper { if (builder.length() > 0) { builder.append(", "); } - builder.append('"')// - .append(item.replace("\\", "\\\\").replace("\"", "\\\""))// - .append('"'); + builder.append(escape(item)); + } + + return builder.toString(); + } + + /** + * Escape the given value for list formating (no \\, no \n). + *

+ * You can unescape it with {@link BundleHelper#unescape(String)} + * + * @param value + * the value to escape + * + * @return an escaped value that can unquoted by the reverse operation + * {@link BundleHelper#unescape(String)} + */ + static public String escape(String value) { + return '"' + value// + .replace("\\", "\\\\") // + .replace("\"", "\\\"") // + .replace("\n", "\\\n") // + .replace("\r", "\\\r") // + + '"'; + } + + /** + * Unescape the given value for list formating (change \\n into \n and so + * on). + *

+ * You can escape it with {@link BundleHelper#escape(String)} + * + * @param value + * the value to escape + * + * @return an unescaped value that can reverted by the reverse operation + * {@link BundleHelper#escape(String)}, or NULL if it was badly + * formated + */ + static public String unescape(String value) { + if (value.length() < 2 || !value.startsWith("\"") + || !value.endsWith("\"")) { + // Bad format + return null; + } + + value = value.substring(1, value.length() - 2); + + boolean prevIsBackslash = false; + StringBuilder builder = new StringBuilder(); + for (char car : value.toCharArray()) { + if (prevIsBackslash) { + switch (car) { + case 'n': + case 'N': + builder.append('\n'); + break; + case 'r': + case 'R': + builder.append('\r'); + break; + default: // includes \ and " + builder.append(car); + break; + } + } else { + if (car == '\\') { + prevIsBackslash = true; + } else { + builder.append(car); + } + } + } + + if (prevIsBackslash) { + // Bad format + return null; } return builder.toString();