Skip to content

Commit

Permalink
[FEATURE] value separator setting moved from code style to general
Browse files Browse the repository at this point in the history
  • Loading branch information
SeeSharpSoft committed Feb 6, 2020
1 parent 2987e88 commit 0c27400
Show file tree
Hide file tree
Showing 27 changed files with 201 additions and 176 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package net.seesharpsoft.intellij.plugins.csv;

import java.util.regex.Pattern;

public enum CsvEscapeCharacter {
QUOTE("\"", "Double Quote (\")"),
BACKSLASH("\\", "Backslash (\\)");

private final String myCharacter;
private final String myDisplay;
private final Pattern myPattern;

CsvEscapeCharacter(String character, String display) {
myCharacter = character;
myDisplay = display;
myPattern = Pattern.compile(Pattern.quote(myCharacter + "\""));
}

public String getCharacter() {
return myCharacter;
}

public String getDisplay() {
return myDisplay;
}

public boolean isEscapedQuote(String text) {
return myPattern.matcher(text).matches();
}
}
19 changes: 9 additions & 10 deletions src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import com.intellij.psi.util.PsiTreeUtil;
import net.seesharpsoft.intellij.lang.FileParserDefinition;
import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvField;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvRecord;
Expand Down Expand Up @@ -152,24 +151,24 @@ public static int getFieldEndOffset(PsiElement field) {
return separator == null ? field.getContainingFile().getTextLength() : separator.getTextOffset();
}

public static CsvEditorSettings.ValueSeparator getCurrentValueSeparator(CsvFile csvFile) {
public static CsvValueSeparator getCurrentValueSeparator(CsvFile csvFile) {
return getCurrentValueSeparator(csvFile.getContainingFile());
}

public static CsvEditorSettings.ValueSeparator getCurrentValueSeparator(PsiFile psiFile) {
public static CsvValueSeparator getCurrentValueSeparator(PsiFile psiFile) {
return CsvFileAttributes.getInstance(psiFile.getProject()).getFileSeparator(psiFile);
}

public static CsvEditorSettings.EscapeCharacter getCurrentEscapeCharacter(CsvFile csvFile) {
public static CsvEscapeCharacter getCurrentEscapeCharacter(CsvFile csvFile) {
return getCurrentEscapeCharacter(csvFile.getContainingFile());
}

public static CsvEditorSettings.EscapeCharacter getCurrentEscapeCharacter(PsiFile psiFile) {
public static CsvEscapeCharacter getCurrentEscapeCharacter(PsiFile psiFile) {
return CsvFileAttributes.getInstance(psiFile.getProject()).getEscapeCharacter(psiFile);
}

public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(CsvFile csvFile) {
CsvEditorSettings.EscapeCharacter escapeCharacter = getCurrentEscapeCharacter(csvFile);
CsvEscapeCharacter escapeCharacter = getCurrentEscapeCharacter(csvFile);
Map<Integer, CsvColumnInfo<PsiElement>> columnInfoMap = new HashMap<>();
CsvRecord[] records = PsiTreeUtil.getChildrenOfType(csvFile, CsvRecord.class);
int row = 0;
Expand All @@ -190,7 +189,7 @@ public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(CsvFile csvFile)
return new CsvColumnInfoMap(columnInfoMap, PsiTreeUtil.hasErrorElements(csvFile));
}

public static String unquoteCsvValue(String content, CsvEditorSettings.EscapeCharacter escapeCharacter) {
public static String unquoteCsvValue(String content, CsvEscapeCharacter escapeCharacter) {
if (content == null) {
return "";
}
Expand All @@ -202,14 +201,14 @@ public static String unquoteCsvValue(String content, CsvEditorSettings.EscapeCha
return result;
}

private static boolean isQuotingRequired(String content, CsvEditorSettings.ValueSeparator valueSeparator) {
private static boolean isQuotingRequired(String content, CsvValueSeparator valueSeparator) {
return content != null &&
(content.contains(valueSeparator.getCharacter()) || content.contains("\"") || content.contains("\n") || content.startsWith(" ") || content.endsWith(" "));
}

public static String quoteCsvField(String content,
CsvEditorSettings.EscapeCharacter escapeCharacter,
CsvEditorSettings.ValueSeparator valueSeparator,
CsvEscapeCharacter escapeCharacter,
CsvValueSeparator valueSeparator,
boolean quotingEnforced) {
if (content == null) {
return "";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package net.seesharpsoft.intellij.plugins.csv;

import com.intellij.psi.tree.IElementType;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes;
import com.intellij.lexer.FlexLexer;
import com.intellij.psi.TokenType;
import com.intellij.lexer.FlexLexer;

import java.util.regex.Pattern;

Expand All @@ -16,15 +15,15 @@ import java.util.regex.Pattern;
%function advance
%type IElementType
%{
private CsvEditorSettings.ValueSeparator myValueSeparator;
private CsvEditorSettings.EscapeCharacter myEscapeCharacter;
private CsvValueSeparator myValueSeparator;
private CsvEscapeCharacter myEscapeCharacter;

private static final Pattern ESCAPE_TEXT_PATTERN = Pattern.compile("[,;|\\t\\r\\n]");

/**
* Provide constructor that supports a Project as parameter.
*/
CsvLexer(java.io.Reader in, CsvEditorSettings.ValueSeparator valueSeparator, CsvEditorSettings.EscapeCharacter escapeCharacter) {
CsvLexer(java.io.Reader in, CsvValueSeparator valueSeparator, CsvEscapeCharacter escapeCharacter) {
this(in);
myValueSeparator = valueSeparator;
myEscapeCharacter = escapeCharacter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package net.seesharpsoft.intellij.plugins.csv;

import com.intellij.lexer.FlexAdapter;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;

public class CsvLexerAdapter extends FlexAdapter {
public CsvLexerAdapter(CsvEditorSettings.ValueSeparator separator, CsvEditorSettings.EscapeCharacter escapeCharacter) {
public CsvLexerAdapter(CsvValueSeparator separator, CsvEscapeCharacter escapeCharacter) {
super(new CsvLexer(null, separator, escapeCharacter));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package net.seesharpsoft.intellij.plugins.csv;

import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;

public interface CsvSeparatorHolder {
CsvEditorSettings.ValueSeparator getSeparator();
CsvValueSeparator getSeparator();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package net.seesharpsoft.intellij.plugins.csv;

import java.util.regex.Pattern;

public enum CsvValueSeparator {
COMMA(",", "Comma (,)"),
SEMICOLON(";", "Semicolon (;)"),
PIPE("|", "Pipe (|)"),
TAB("\t", "Tab (↹)");

private final String myCharacter;
private final String myDisplay;
private final Pattern myPattern;

CsvValueSeparator(String character, String display) {
myCharacter = character;
myDisplay = display;
myPattern = Pattern.compile(Pattern.quote(myCharacter));
}

public String getCharacter() {
return myCharacter;
}

public String getDisplay() {
return myDisplay;
}

public boolean isValueSeparator(String text) {
return myPattern.matcher(text).matches();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.psi.PsiFile;
import com.intellij.util.FileContentUtilCore;
import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter;
import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import org.jetbrains.annotations.NotNull;

public class CsvChangeEscapeCharacterAction extends ToggleAction {
private CsvEditorSettings.EscapeCharacter myEscapeCharacter;
private CsvEscapeCharacter myEscapeCharacter;

CsvChangeEscapeCharacterAction(CsvEditorSettings.EscapeCharacter escapeCharacter) {
CsvChangeEscapeCharacterAction(CsvEscapeCharacter escapeCharacter) {
super(escapeCharacter.getDisplay());
myEscapeCharacter = escapeCharacter;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.psi.PsiFile;
import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter;
import net.seesharpsoft.intellij.plugins.csv.CsvLanguage;
import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -17,9 +17,9 @@ public class CsvChangeEscapeCharacterActionGroup extends ActionGroup {
private static final AnAction[] CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS;

static {
CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS = new AnAction[CsvEditorSettings.EscapeCharacter.values().length + 1];
CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS = new AnAction[CsvEscapeCharacter.values().length + 1];
for (int i = 0; i < CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS.length - 1; ++i) {
CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS[i] = new CsvChangeEscapeCharacterAction(CsvEditorSettings.EscapeCharacter.values()[i]);
CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS[i] = new CsvChangeEscapeCharacterAction(CsvEscapeCharacter.values()[i]);
}
CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS[CSV_ESCAPE_CHARACTER_CHANGE_ACTIONS.length - 1] = new CsvDefaultEscapeCharacterAction();
}
Expand All @@ -31,7 +31,7 @@ public void update(AnActionEvent anActionEvent) {
anActionEvent.getPresentation().setEnabledAndVisible(psiFile != null && language != null && language.isKindOf(CsvLanguage.INSTANCE));

if (psiFile != null) {
CsvEditorSettings.EscapeCharacter escapeCharacter = CsvFileAttributes.getInstance(psiFile.getProject()).getEscapeCharacter(psiFile);
CsvEscapeCharacter escapeCharacter = CsvFileAttributes.getInstance(psiFile.getProject()).getEscapeCharacter(psiFile);
anActionEvent.getPresentation().setText(String.format("CSV Escape Character: %s", escapeCharacter.getDisplay()));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
import com.intellij.util.FileContentUtilCore;
import net.seesharpsoft.intellij.plugins.csv.CsvLanguage;
import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder;
import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator;
import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import org.jetbrains.annotations.NotNull;

public class CsvChangeSeparatorAction extends ToggleAction {
private CsvEditorSettings.ValueSeparator mySeparator;
private CsvValueSeparator mySeparator;

CsvChangeSeparatorAction(CsvEditorSettings.ValueSeparator separator) {
CsvChangeSeparatorAction(CsvValueSeparator separator) {
super(separator.getDisplay());
mySeparator = separator;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import net.seesharpsoft.intellij.plugins.csv.CsvHelper;
import net.seesharpsoft.intellij.plugins.csv.CsvLanguage;
import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -18,9 +18,9 @@ public class CsvChangeSeparatorActionGroup extends ActionGroup {
private static final AnAction[] CSV_SEPARATOR_CHANGE_ACTIONS;

static {
CSV_SEPARATOR_CHANGE_ACTIONS = new AnAction[CsvEditorSettings.ValueSeparator.values().length + 1];
CSV_SEPARATOR_CHANGE_ACTIONS = new AnAction[CsvValueSeparator.values().length + 1];
for (int i = 0; i < CSV_SEPARATOR_CHANGE_ACTIONS.length - 1; ++i) {
CSV_SEPARATOR_CHANGE_ACTIONS[i] = new CsvChangeSeparatorAction(CsvEditorSettings.ValueSeparator.values()[i]);
CSV_SEPARATOR_CHANGE_ACTIONS[i] = new CsvChangeSeparatorAction(CsvValueSeparator.values()[i]);
}
CSV_SEPARATOR_CHANGE_ACTIONS[CSV_SEPARATOR_CHANGE_ACTIONS.length - 1] = new CsvDefaultSeparatorAction();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.util.xmlb.XmlSerializerUtil;
import net.seesharpsoft.intellij.plugins.csv.CsvLanguage;
import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder;
import net.seesharpsoft.intellij.plugins.csv.CsvStorageHelper;
import net.seesharpsoft.intellij.plugins.csv.*;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -32,8 +30,8 @@ public class CsvFileAttributes implements PersistentStateComponent<CsvFileAttrib

static class Attribute {
public String separator;
public CsvEditorSettings.ValueSeparator valueSeparator;
public CsvEditorSettings.EscapeCharacter escapeCharacter;
public CsvValueSeparator valueSeparator;
public CsvEscapeCharacter escapeCharacter;
}

public static CsvFileAttributes getInstance(Project project) {
Expand All @@ -58,7 +56,7 @@ private void legacyTransformation() {
for(Map.Entry<String, Attribute> entry : attributeMap.entrySet()) {
Attribute attribute = entry.getValue();
if (attribute.valueSeparator == null && attribute.separator != null) {
attribute.valueSeparator = Arrays.stream(CsvEditorSettings.ValueSeparator.values())
attribute.valueSeparator = Arrays.stream(CsvValueSeparator.values())
.filter(vs -> vs.getCharacter().equals(attribute.separator))
.findFirst().orElse(null);
attribute.separator = null;
Expand Down Expand Up @@ -102,7 +100,7 @@ public boolean canChangeValueSeparator(@NotNull PsiFile psiFile) {
return language.isKindOf(CsvLanguage.INSTANCE) && !(language instanceof CsvSeparatorHolder);
}

public void setFileSeparator(@NotNull PsiFile psiFile, @NotNull CsvEditorSettings.ValueSeparator separator) {
public void setFileSeparator(@NotNull PsiFile psiFile, @NotNull CsvValueSeparator separator) {
if (!canChangeValueSeparator(psiFile)) {
return;
}
Expand All @@ -120,7 +118,8 @@ public void resetValueSeparator(@NotNull PsiFile psiFile) {
}
}

public @NotNull CsvEditorSettings.ValueSeparator getFileSeparator(Project project, VirtualFile virtualFile) {
public @NotNull
CsvValueSeparator getFileSeparator(Project project, VirtualFile virtualFile) {
if (project == null || virtualFile == null) {
return CsvEditorSettings.getInstance().getDefaultValueSeparator();
}
Expand All @@ -135,7 +134,7 @@ public void resetValueSeparator(@NotNull PsiFile psiFile) {
attribute.valueSeparator;
}

public CsvEditorSettings.ValueSeparator getFileSeparator(@NotNull PsiFile psiFile) {
public CsvValueSeparator getFileSeparator(@NotNull PsiFile psiFile) {
return getFileSeparator(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
}

Expand All @@ -148,7 +147,7 @@ public boolean hasSeparatorAttribute(@NotNull PsiFile psiFile) {
return hasSeparatorAttribute(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
}

public void setEscapeCharacter(@NotNull PsiFile psiFile, @NotNull CsvEditorSettings.EscapeCharacter escapeCharacter) {
public void setEscapeCharacter(@NotNull PsiFile psiFile, @NotNull CsvEscapeCharacter escapeCharacter) {
Attribute attribute = getFileAttribute(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile(), true);
attribute.escapeCharacter = escapeCharacter;
}
Expand All @@ -160,7 +159,8 @@ public void resetEscapeSeparator(@NotNull PsiFile psiFile) {
}
}

public @NotNull CsvEditorSettings.EscapeCharacter getEscapeCharacter(Project project, VirtualFile virtualFile) {
public @NotNull
CsvEscapeCharacter getEscapeCharacter(Project project, VirtualFile virtualFile) {
if (project == null || virtualFile == null) {
return CsvEditorSettings.getInstance().getDefaultEscapeCharacter();
}
Expand All @@ -170,7 +170,7 @@ public void resetEscapeSeparator(@NotNull PsiFile psiFile) {
attribute.escapeCharacter;
}

public CsvEditorSettings.EscapeCharacter getEscapeCharacter(@NotNull PsiFile psiFile) {
public CsvEscapeCharacter getEscapeCharacter(@NotNull PsiFile psiFile) {
return getEscapeCharacter(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.intellij.xml.util.XmlStringUtil;
import net.seesharpsoft.intellij.plugins.csv.CsvColumnInfo;
import net.seesharpsoft.intellij.plugins.csv.CsvHelper;
import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes;
import net.seesharpsoft.intellij.plugins.csv.settings.CsvColorSettings;
Expand Down Expand Up @@ -87,8 +88,8 @@ protected boolean handleSeparatorElement(@NotNull PsiElement element, @NotNull A
if (elementType == CsvTypes.COMMA) {
TextAttributes textAttributes = holder.getCurrentAnnotationSession().getUserData(TAB_SEPARATOR_HIGHLIGHT_COLOR_KEY);
if (!Boolean.TRUE.equals(holder.getCurrentAnnotationSession().getUserData(TAB_SEPARATOR_HIGHLIGHT_COLOR_DETERMINED_KEY))) {
CsvEditorSettings.ValueSeparator separator = CsvHelper.getCurrentValueSeparator(csvFile);
if (CsvEditorSettings.getInstance().isHighlightTabSeparator() && separator.equals(CsvEditorSettings.ValueSeparator.TAB)) {
CsvValueSeparator separator = CsvHelper.getCurrentValueSeparator(csvFile);
if (CsvEditorSettings.getInstance().isHighlightTabSeparator() && separator.equals(CsvValueSeparator.TAB)) {
textAttributes = new TextAttributes(null,
CsvEditorSettings.getInstance().getTabHighlightColor(),
null, null, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@
import com.intellij.psi.PsiFile;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.UIUtil;
import net.seesharpsoft.intellij.plugins.csv.CsvColumnInfo;
import net.seesharpsoft.intellij.plugins.csv.CsvColumnInfoMap;
import net.seesharpsoft.intellij.plugins.csv.CsvHelper;
import net.seesharpsoft.intellij.plugins.csv.*;
import net.seesharpsoft.intellij.plugins.csv.editor.table.api.TableActions;
import net.seesharpsoft.intellij.plugins.csv.editor.table.api.TableDataHandler;
import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile;
Expand Down Expand Up @@ -51,8 +49,8 @@ public abstract class CsvTableEditor implements FileEditor, FileEditorLocation {

protected Document document;
protected PsiFile psiFile;
protected CsvEditorSettings.ValueSeparator currentSeparator;
protected CsvEditorSettings.EscapeCharacter currentEscapeCharacter;
protected CsvValueSeparator currentSeparator;
protected CsvEscapeCharacter currentEscapeCharacter;

private Object[][] initialState = null;
private CsvTableEditorState storedState = null;
Expand Down

0 comments on commit 0c27400

Please sign in to comment.