diff --git a/CHANGELOG b/CHANGELOG index b2587052..dfcfd391 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ 2.12.0 -Jun 13, 2020 +Jun 14, 2020 +NEW: flexible settings format for value separator & escape character FIX: no accessors for class CsvValueSeparator #221 FIX: Default Value Separator get frequently reset to comma, changes only applied after restart #222 diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java index d4927817..ad11d55b 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java @@ -1,21 +1,71 @@ package net.seesharpsoft.intellij.plugins.csv; -import java.util.regex.Pattern; +import com.intellij.util.xmlb.Converter; -public enum CsvEscapeCharacter { - QUOTE("\"", "Double Quote (\")", "\""), - BACKSLASH("\\", "Backslash (\\)", "\\\\"); +import java.util.Objects; +import java.util.regex.Pattern; +public class CsvEscapeCharacter { private final String myCharacter; private final String myDisplay; private final Pattern myPattern; private final String myRegexPattern; + private final String myName; + + private static final String CUSTOM_NAME = "CUSTOM"; + private static final String CUSTOM_DISPLAY = "Custom"; + + public static CsvEscapeCharacter QUOTE = new CsvEscapeCharacter("\"", "Double Quote (\")", "\"", "QUOTE"); + public static CsvEscapeCharacter BACKSLASH = new CsvEscapeCharacter("\\", "Backslash (\\)", "\\\\", "BACKSLASH"); + + public static CsvEscapeCharacter[] values() { + return new CsvEscapeCharacter[]{QUOTE, BACKSLASH}; + } + + public static CsvEscapeCharacter getDefaultEscapeCharacter(String character) { + if (character != null) { + switch (character) { + case "QUOTE": + case "\"": + return QUOTE; + case "BACKSLASH": + case "\\": + return BACKSLASH; + default: + break; + } + } + return null; + } + + public static CsvEscapeCharacter create(String character) { + if (character == null) { + return null; + } + CsvEscapeCharacter defaultEscapeCharacter = getDefaultEscapeCharacter(character); + return defaultEscapeCharacter == null ? new CsvEscapeCharacter(character) : defaultEscapeCharacter; + } + + public static class CsvEscapeCharacterConverter extends Converter { + public CsvEscapeCharacter fromString(String value) { + return CsvEscapeCharacter.create(value); + } + + public String toString(CsvEscapeCharacter value) { + return value.getCharacter(); + } + } - CsvEscapeCharacter(String character, String display, String regexPattern) { + public CsvEscapeCharacter(String myCharacter) { + this(myCharacter, CUSTOM_DISPLAY + " (" + myCharacter + ")", Pattern.quote(myCharacter), CUSTOM_NAME); + } + + private CsvEscapeCharacter(String character, String display, String regexPattern, String name) { myCharacter = character; myDisplay = display; myRegexPattern = regexPattern; myPattern = Pattern.compile(Pattern.quote(myCharacter + "\"")); + myName = name; } public String getCharacter() { @@ -33,4 +83,31 @@ public String getRegexPattern() { public boolean isEscapedQuote(String text) { return myPattern.matcher(text).matches(); } + + public String getName() { + return myName; + } + + public boolean isCustom() { + return CUSTOM_NAME.equals(getName()); + } + + @Override + public int hashCode() { + return Objects.hash(getCharacter(), isCustom()); + } + + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof CsvEscapeCharacter)) { + return false; + } + CsvEscapeCharacter otherObj = (CsvEscapeCharacter)obj; + return Objects.equals(otherObj.getCharacter(), this.getCharacter()) && Objects.equals(otherObj.isCustom(), this.isCustom()); + } + + @Override + public String toString() { + return getDisplay(); + } } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java index b60dcab0..2450a560 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java @@ -20,9 +20,9 @@ public class CsvValueSeparator { public static final CsvValueSeparator TAB = new CsvValueSeparator("\t", "Tab (↹)", "TAB"); public static final CsvValueSeparator COLON = new CsvValueSeparator(":", "Colon (:)", "COLON"); - public static CsvValueSeparator getDefaultValueSeparator(String name) { - if (name != null) { - switch (name) { + public static CsvValueSeparator getDefaultValueSeparator(String character) { + if (character != null) { + switch (character) { case "COMMA": case ",": return COMMA; @@ -45,19 +45,12 @@ public static CsvValueSeparator getDefaultValueSeparator(String name) { return null; } - public static CsvValueSeparator create(String name, String character) { - CsvValueSeparator defaultValueSeparator = getDefaultValueSeparator(name); - if (defaultValueSeparator != null) { - return defaultValueSeparator; - } - return create(character); - } - public static CsvValueSeparator create(String character) { if (character == null) { return null; } - return new CsvValueSeparator(character); + CsvValueSeparator defaultValueSeparator = getDefaultValueSeparator(character); + return defaultValueSeparator == null ? new CsvValueSeparator(character) : defaultValueSeparator; } public static CsvValueSeparator[] values() { @@ -66,12 +59,11 @@ public static CsvValueSeparator[] values() { public static class CsvValueSeparatorConverter extends Converter { public CsvValueSeparator fromString(String value) { - int index = value.indexOf("@"); - return index == -1 ? CsvValueSeparator.create(value, value) : CsvValueSeparator.create(value.substring(0, index), value.substring(index + 1)); + return CsvValueSeparator.create(value); } public String toString(CsvValueSeparator value) { - return value.getName() + "@" + value.getCharacter(); + return value.getCharacter(); } } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java index 4573e3ce..a2977983 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java @@ -31,6 +31,7 @@ public class CsvFileAttributes implements PersistentStateComponent +NEW: flexible settings format for value separator & escape character FIX: no accessors for class CsvValueSeparator #221 FIX: Default Value Separator get frequently reset to comma, changes only applied after restart #222