|
package com.github.javaparser.utils; |
|
|
|
import com.github.javaparser.JavaToken; |
|
|
|
import java.util.Optional; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public enum LineSeparator { |
|
|
|
|
|
*/ |
|
CR("\r", "CR (\\r)"), |
|
|
|
|
|
*/ |
|
LF("\n", "LF (\\n)"), |
|
|
|
|
|
*/ |
|
CRLF("\r\n", "CRLF (\\r\\n)"), |
|
|
|
|
|
*/ |
|
SYSTEM( |
|
System.getProperty("line.separator"), |
|
"SYSTEM : (" + System.getProperty("line.separator") |
|
.replace("\r", "\\r") |
|
.replace("\n", "\\n") + |
|
")" |
|
), |
|
|
|
|
|
|
|
*/ |
|
ARBITRARY("\n", "ARBITRARY (\\n)"), |
|
|
|
|
|
|
|
*/ |
|
MIXED("", "MIXED"), |
|
|
|
|
|
|
|
*/ |
|
UNKNOWN("", "UNKNOWN"), |
|
|
|
|
|
*/ |
|
NONE("", "NONE"); |
|
|
|
private final String text; |
|
private final String description; |
|
|
|
LineSeparator(String text, String description) { |
|
this.text = text; |
|
this.description = description; |
|
} |
|
|
|
|
|
|
|
*/ |
|
private static int count(String haystack, String needle) { |
|
|
|
return (haystack.length() - haystack.replaceAll(needle, "").length()) / needle.length(); |
|
} |
|
|
|
public static LineSeparator detect(String string) { |
|
int countCr = count(string, "\r"); |
|
int countLf = count(string, "\n"); |
|
int countCrLf = count(string, "\r\n"); |
|
|
|
return getLineEnding(countCr, countLf, countCrLf); |
|
} |
|
|
|
public static LineSeparator getLineEnding(int countCr, int countLf, int countCrLf) { |
|
boolean noLineEndings = countCr == 0 && countLf == 0 && countCrLf == 0; |
|
if (noLineEndings) { |
|
return NONE; |
|
} |
|
|
|
boolean crOnly = countCr > 0 && countLf == 0 && countCrLf == 0; |
|
if (crOnly) { |
|
return CR; |
|
} |
|
boolean lfOnly = countCr == 0 && countLf > 0 && countCrLf == 0; |
|
if (lfOnly) { |
|
return LF; |
|
} |
|
|
|
|
|
boolean crLfOnly = countCr == countLf && countLf == countCrLf; |
|
if (crLfOnly) { |
|
return CRLF; |
|
} |
|
|
|
|
|
return MIXED; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static Optional<LineSeparator> lookup(String ending) { |
|
if (CR.asRawString().equals(ending)) { |
|
return Optional.of(CR); |
|
} else if (LF.asRawString().equals(ending)) { |
|
return Optional.of(LF); |
|
} else if (CRLF.asRawString().equals(ending)) { |
|
return Optional.of(CRLF); |
|
} else { |
|
return Optional.empty(); |
|
} |
|
} |
|
|
|
public static Optional<LineSeparator> lookupEscaped(String ending) { |
|
if (CR.asEscapedString().equals(ending)) { |
|
return Optional.of(CR); |
|
} else if (LF.asEscapedString().equals(ending)) { |
|
return Optional.of(LF); |
|
} else if (CRLF.asEscapedString().equals(ending)) { |
|
return Optional.of(CRLF); |
|
} else { |
|
return Optional.empty(); |
|
} |
|
} |
|
|
|
public String describe() { |
|
|
|
return description; |
|
} |
|
|
|
public boolean equalsString(LineSeparator lineSeparator) { |
|
return text.equals(lineSeparator.asRawString()); |
|
} |
|
|
|
public boolean isStandardEol() { |
|
|
|
return equalsString(LineSeparator.CR) || equalsString(LineSeparator.LF) || equalsString(LineSeparator.CRLF); |
|
} |
|
|
|
public String asEscapedString() { |
|
String result = text |
|
.replace("\r", "\\r") |
|
.replace("\n", "\\n"); |
|
|
|
return result; |
|
} |
|
|
|
public String asRawString() { |
|
return text; |
|
} |
|
|
|
|
|
private Optional<JavaToken.Kind> asJavaTokenKind() { |
|
if(this == CR) { |
|
return Optional.of(JavaToken.Kind.OLD_MAC_EOL); |
|
} else if(this == LF) { |
|
return Optional.of(JavaToken.Kind.UNIX_EOL); |
|
} else if(this == CRLF) { |
|
return Optional.of(JavaToken.Kind.WINDOWS_EOL); |
|
} |
|
|
|
return Optional.empty(); |
|
} |
|
|
|
@Override |
|
public String toString() { |
|
return asRawString(); |
|
} |
|
|
|
} |