1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.pattern;
18
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.Locale;
22 import java.util.Map;
23
24
25
26
27
28
29
30
31 public enum AnsiEscape {
32
33 PREFIX("\u001b["),
34 SUFFIX("m"),
35 SEPARATOR(";"),
36
37
38
39
40 NORMAL("0"),
41 BRIGHT("1"),
42 DIM("2"),
43 UNDERLINE("3"),
44 BLINK("5"),
45 REVERSE("7"),
46 HIDDEN("8"),
47
48
49
50
51 BLACK("30"),
52 FG_BLACK("30"),
53 RED("31"),
54 FG_RED("31"),
55 GREEN("32"),
56 FG_GREEN("32"),
57 YELLOW("33"),
58 FG_YELLOW("33"),
59 BLUE("34"),
60 FG_BLUE("34"),
61 MAGENTA("35"),
62 FG_MAGENTA("35"),
63 CYAN("36"),
64 FG_CYAN("36"),
65 WHITE("37"),
66 FG_WHITE("37"),
67 DEFAULT("39"),
68 FG_DEFAULT("39"),
69
70
71
72
73 BG_BLACK("40"),
74 BG_RED("41"),
75 BG_GREEN("42"),
76 BG_YELLOW("43"),
77 BG_BLUE("44"),
78 BG_MAGENTA("45"),
79 BG_CYAN("46"),
80 BG_WHITE("47");
81
82 private static final String WHITESPACE_REGEX = "\\s*";
83
84 private final String code;
85
86 private AnsiEscape(String code) {
87 this.code = code;
88 }
89
90 public static String getDefaultStyle() {
91 return PREFIX.getCode() + SUFFIX.getCode();
92 }
93
94 private static String toRegexSeparator(String separator) {
95 return WHITESPACE_REGEX + separator + WHITESPACE_REGEX;
96 }
97
98 public String getCode() {
99 return code;
100 }
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 public static Map<String, String> createMap(String values, String[] dontEscapeKeys) {
125 return createMap(values.split(toRegexSeparator(",")), dontEscapeKeys);
126 }
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 public static Map<String, String> createMap(String[] values, String[] dontEscapeKeys) {
151 final String[] sortedIgnoreKeys = dontEscapeKeys != null ? dontEscapeKeys.clone() : new String[0];
152 Arrays.sort(sortedIgnoreKeys);
153 Map<String, String> map = new HashMap<String, String>();
154 for (String string : values) {
155 String[] keyValue = string.split(toRegexSeparator("="));
156 if (keyValue.length > 1) {
157 final String key = keyValue[0].toUpperCase(Locale.ENGLISH);
158 final String value = keyValue[1];
159 final boolean escape = Arrays.binarySearch(sortedIgnoreKeys, key) < 0;
160 map.put(key, escape ? createSequence(value.split("\\s")) : value);
161 }
162 }
163 return map;
164 }
165
166
167
168
169
170
171
172
173 public static String createSequence(String[] names) {
174 if (names == null) {
175 return getDefaultStyle();
176 }
177 StringBuilder sb = new StringBuilder(AnsiEscape.PREFIX.getCode());
178 boolean first = true;
179 for (String name : names) {
180 try {
181 AnsiEscape escape = AnsiEscape.valueOf(name.trim().toUpperCase(Locale.ENGLISH));
182 if (!first) {
183 sb.append(AnsiEscape.SEPARATOR.getCode());
184 }
185 first = false;
186 sb.append(escape.getCode());
187 } catch (Exception ex) {
188
189 }
190 }
191 sb.append(AnsiEscape.SUFFIX.getCode());
192 return sb.toString();
193 }
194
195 }