4de1ad54b1d3ff8492d53fd97642b7fa964bb23f
[idea/community.git] / platform / util / src / com / intellij / util / LineSeparator.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.util;
3
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.util.SystemInfo;
6 import com.intellij.openapi.util.text.StringUtil;
7 import org.jetbrains.annotations.NotNull;
8
9 import java.nio.charset.StandardCharsets;
10
11 /**
12  * <p>Identifies a line separator:
13  * either Unix ({@code \n}), Windows (@{code \r\n}) or (possible not actual anymore) Classic Mac ({@code \r}).</p>
14  * <p/>
15  * <p>The intention is to use this class everywhere, where a line separator is needed, instead of just Strings.</p>
16  *
17  * @author Kirill Likhodedov
18  */
19 public enum LineSeparator {
20   LF("\n"),
21   CRLF("\r\n"),
22   CR("\r");
23
24   private final String mySeparatorString;
25   private final byte[] myBytes;
26
27   LineSeparator(@NotNull String separatorString) {
28     mySeparatorString = separatorString;
29     myBytes = separatorString.getBytes(StandardCharsets.UTF_8);
30   }
31
32   @NotNull
33   public static LineSeparator fromString(@NotNull String string) {
34     for (LineSeparator separator : values()) {
35       if (separator.getSeparatorString().equals(string)) {
36         return separator;
37       }
38     }
39     Logger.getInstance(LineSeparator.class).error("Invalid string for line separator: " + StringUtil.escapeStringCharacters(string));
40     return getSystemLineSeparator();
41   }
42
43   @NotNull
44   public String getSeparatorString() {
45     return mySeparatorString;
46   }
47
48   public byte @NotNull [] getSeparatorBytes() {
49     return myBytes;
50   }
51
52   @NotNull
53   public static LineSeparator getSystemLineSeparator() {
54     return SystemInfo.isWindows ? CRLF : LF;
55   }
56 }