Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG
Original file line number Diff line number Diff line change
@@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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<CsvEscapeCharacter> {
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() {
Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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() {
Expand All @@ -66,12 +59,11 @@ public static CsvValueSeparator[] values() {

public static class CsvValueSeparatorConverter extends Converter<CsvValueSeparator> {
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();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class CsvFileAttributes implements PersistentStateComponent<CsvFileAttrib
static class Attribute {
@OptionTag(converter = CsvValueSeparator.CsvValueSeparatorConverter.class)
public CsvValueSeparator separator;
@OptionTag(converter = CsvEscapeCharacter.CsvEscapeCharacterConverter.class)
public CsvEscapeCharacter escapeCharacter;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public static final class OptionSet {
public boolean SHOW_TABLE_EDITOR_INFO_PANEL = true;
public boolean QUOTING_ENFORCED = false;
public boolean FILE_END_LINE_BREAK = true;
@OptionTag(converter = CsvEscapeCharacter.CsvEscapeCharacterConverter.class)
public CsvEscapeCharacter DEFAULT_ESCAPE_CHARACTER = ESCAPE_CHARACTER_DEFAULT;
@OptionTag(converter = CsvValueSeparator.CsvValueSeparatorConverter.class)
public CsvValueSeparator DEFAULT_VALUE_SEPARATOR = VALUE_SEPARATOR_DEFAULT;
Expand Down Expand Up @@ -246,7 +247,8 @@ public void setDefaultEscapeCharacter(CsvEscapeCharacter defaultEscapeCharacter)
}

public CsvEscapeCharacter getDefaultEscapeCharacter() {
return getState().DEFAULT_ESCAPE_CHARACTER;
CsvEscapeCharacter csvValueSeparator = getState().DEFAULT_ESCAPE_CHARACTER;
return csvValueSeparator == null ? ESCAPE_CHARACTER_DEFAULT : getState().DEFAULT_ESCAPE_CHARACTER;
}

public void setDefaultValueSeparator(CsvValueSeparator defaultValueSeparator) {
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@

<change-notes><![CDATA[
<pre style="font-family: sans-serif">
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
</pre>
Expand Down