This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 3199da4a8ba72112d882a9f23d65953d1954606b
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue May 25 22:02:42 2021 +0100

    Update import/export to handle POEditor behaviours
    
    The end results for
    Tomcat-Export->Tomcat-Import
    and
    Tomcat-Export->POEditor-Import->POEditor-Export->Tomcat-Import
    are now much more similar
---
 .../apache/tomcat/buildutil/translate/Import.java  |  2 +-
 .../apache/tomcat/buildutil/translate/Utils.java   | 53 ++++++++++++++++------
 .../tomcat/buildutil/translate/TestUtils.java      | 39 ++++++++++++++--
 3 files changed, 75 insertions(+), 19 deletions(-)

diff --git a/java/org/apache/tomcat/buildutil/translate/Import.java 
b/java/org/apache/tomcat/buildutil/translate/Import.java
index ae40353..e1fe9a3 100644
--- a/java/org/apache/tomcat/buildutil/translate/Import.java
+++ b/java/org/apache/tomcat/buildutil/translate/Import.java
@@ -82,7 +82,7 @@ public class Import {
                 w.write(System.lineSeparator());
             }
 
-            w.write(cKey.key + "=" + Utils.formatValue(value));
+            w.write(cKey.key + "=" + Utils.formatValueImport(value));
             w.write(System.lineSeparator());
         }
         if (w != null) {
diff --git a/java/org/apache/tomcat/buildutil/translate/Utils.java 
b/java/org/apache/tomcat/buildutil/translate/Utils.java
index 326d7fc..4550448 100644
--- a/java/org/apache/tomcat/buildutil/translate/Utils.java
+++ b/java/org/apache/tomcat/buildutil/translate/Utils.java
@@ -32,9 +32,10 @@ import java.util.regex.Pattern;
 
 public class Utils {
 
-    private static final Pattern ADD_CONTINUATION = Pattern.compile("\\n", 
Pattern.MULTILINE);
     private static final Pattern ESCAPE_LEADING_SPACE = 
Pattern.compile("^(\\s)", Pattern.MULTILINE);
-    private static final Pattern FIX_SINGLE_QUOTE = 
Pattern.compile("(?<!')'(?!')", Pattern.MULTILINE);
+
+    // Package private so it is visible to tests
+    static final String PADDING = "POEDITOR_EXPORT_PADDING_DO_NOT_DELETE";
 
     private Utils() {
         // Utility class. Hide default constructor.
@@ -59,21 +60,47 @@ public class Utils {
     }
 
 
-    static String formatValue(String in) {
-        String result = ADD_CONTINUATION.matcher(in).replaceAll("\\\\n\\\\\n");
-        if (result.endsWith("\\\n")) {
-            result = result.substring(0, result.length() - 2);
+    static String formatValueExport(String in) {
+        String result;
+
+        if (in.startsWith("\n")) {
+            result = PADDING + in;
+        } else {
+            result = in;
         }
-        result = ESCAPE_LEADING_SPACE.matcher(result).replaceAll("\\\\$1");
 
-        if (result.contains("\n\\\t")) {
-            result = result.replace("\n\\\t", "\n\\t");
+        return formatValueCommon(result);
+    }
+
+
+    static String formatValueImport(String in) {
+        String result;
+
+        if (in.startsWith(PADDING)) {
+            result = in.substring(PADDING.length());
+        } else {
+            result = in;
         }
 
-        if (result.contains("[{0}]")) {
-            result = FIX_SINGLE_QUOTE.matcher(result).replaceAll("''");
+        return formatValueCommon(result);
+    }
+
+
+    /*
+     * Common formatting to convert a String for storage as a value in a
+     * property file.
+     */
+    static String formatValueCommon(String in) {
+        String result = in.replace("\n", "\\n\\\n");
+        if (result.endsWith("\\n\\\n")) {
+            result = result.substring(0, result.length() - 2);
         }
-        return result.trim();
+
+        result = ESCAPE_LEADING_SPACE.matcher(result).replaceAll("\\\\$1");
+
+        result = result.replaceAll("\t", "\\t");
+
+        return result;
     }
 
 
@@ -143,7 +170,7 @@ public class Utils {
             String[] keys = translation.keySet().toArray(new String[0]);
             Arrays.sort(keys);
             for (Object key : keys) {
-                w.write(key + "=" + 
Utils.formatValue(translation.getProperty((String) key)) + "\n");
+                w.write(key + "=" + 
Utils.formatValueExport(translation.getProperty((String) key)) + "\n");
             }
         } catch (IOException ioe) {
             ioe.printStackTrace();
diff --git a/test/org/apache/tomcat/buildutil/translate/TestUtils.java 
b/test/org/apache/tomcat/buildutil/translate/TestUtils.java
index 533ed95..f8a20f1 100644
--- a/test/org/apache/tomcat/buildutil/translate/TestUtils.java
+++ b/test/org/apache/tomcat/buildutil/translate/TestUtils.java
@@ -23,28 +23,57 @@ public class TestUtils {
 
     @Test
     public void testQuoteReplacement01() {
-        Assert.assertEquals("[{0}] a''a", Utils.formatValue("[{0}] a'a"));
+        Assert.assertEquals("[{0}] a''a", Utils.formatValueImport("[{0}] 
a'a"));
     }
 
     @Test
     public void testQuoteReplacement02() {
-        Assert.assertEquals("[{0}] a''", Utils.formatValue("[{0}] a'"));
+        Assert.assertEquals("[{0}] a''", Utils.formatValueImport("[{0}] a'"));
     }
 
 
     @Test
     public void testQuoteReplacement03() {
-        Assert.assertEquals("''a [{0}]", Utils.formatValue("'a [{0}]"));
+        Assert.assertEquals("''a [{0}]", Utils.formatValueImport("'a [{0}]"));
     }
 
     @Test
     public void testQuoteReplacement05() {
-        Assert.assertEquals("[{0}] ''a'' bbb", Utils.formatValue("[{0}] 'a' 
bbb"));
+        Assert.assertEquals("[{0}] ''a'' bbb", Utils.formatValueImport("[{0}] 
'a' bbb"));
     }
 
     @Test
     public void testQuoteReplacement06() {
-        Assert.assertEquals("[{0}] ''aa'' bbb", Utils.formatValue("[{0}] 'aa' 
bbb"));
+        Assert.assertEquals("[{0}] ''aa'' bbb", Utils.formatValueImport("[{0}] 
'aa' bbb"));
     }
 
+    @Test
+    public void testFormatValue01() {
+        // Import from Tomcat
+        Assert.assertEquals("\\n\\\n</web-fragment>\\n", 
Utils.formatValueImport("\\n\\\n</web-fragment>\\n"));
+    }
+
+    @Test
+    public void testFormatValue02() {
+        // Import from POEditor
+        Assert.assertEquals("\\n\\\n</web-fragment>\\n", 
Utils.formatValueImport("\\n</web-fragment>\\n"));
+    }
+
+    @Test
+    public void testFormatValue03() {
+        // Export from Tomcat
+        Assert.assertEquals("line1\\n\\\nline2\\n\\\nline3", 
Utils.formatValueExport("line1\nline2\nline3"));
+    }
+
+    @Test
+    public void testFormatValue04() {
+        // Export from Tomcat
+        Assert.assertEquals(Utils.PADDING + "\\n\\\nline2\\n\\\nline3", 
Utils.formatValueExport("\nline2\nline3"));
+    }
+
+    @Test
+    public void testFormatValue05() {
+        // Export from Tomcat
+        Assert.assertEquals("line1\\n\\\n\\tline2\\n\\\n\\tline3", 
Utils.formatValueExport("line1\n\tline2\n\tline3"));
+    }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to