-
Notifications
You must be signed in to change notification settings - Fork 35
/
SelectGraphicRendition.java
110 lines (99 loc) · 3.72 KB
/
SelectGraphicRendition.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package org.jboss.tools.aesh.core.internal.ansi;
import java.util.StringTokenizer;
import org.jboss.tools.aesh.core.ansi.Document;
import org.jboss.tools.aesh.core.ansi.AnsiStyleRange;
import org.jboss.tools.aesh.core.internal.AeshCorePlugin;
public class SelectGraphicRendition extends AbstractControlSequence {
private String arguments;
public SelectGraphicRendition(String arguments) {
this.arguments = arguments;
}
@Override
public ControlSequenceType getType() {
return ControlSequenceType.SELECT_GRAPHIC_RENDITION;
}
@Override
public void handle(Document document) {
AnsiStyleRange styleRange = document.newStyleRangeFromCurrent();
StringTokenizer tokenizer = new StringTokenizer(arguments, ";");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if ("".equals(token)) continue;
try {
int value = Integer.valueOf(token);
if (value == 38 || value == 48) {
handleXTerm(value, tokenizer, styleRange);
} else {
handleDefault(value, styleRange);
}
} catch (NumberFormatException e) {
AeshCorePlugin.log(e);
}
}
document.setCurrentStyleRange(styleRange);
}
private void handleXTerm(
int sgrCode,
StringTokenizer tokenizer,
AnsiStyleRange styleRange) {
if (tokenizer.hasMoreTokens()) {
String str = tokenizer.nextToken();
try {
int value = Integer.valueOf(str);
if (value == 5) {
if (tokenizer.hasMoreTokens()) {
int code = Integer.valueOf(tokenizer.nextToken());
if (sgrCode == 38) {
styleRange.setForegroundXTerm(code);
} else if (sgrCode == 48) {
styleRange.setBackgroundXTerm(code);
}
} else {
AeshCorePlugin.log(new RuntimeException("Incorrect SGR instruction: " + arguments));
}
} else {
AeshCorePlugin.log(new RuntimeException("Incorrect SGR instruction: " + arguments));
}
} catch (NumberFormatException e) {
AeshCorePlugin.log(e);
}
} else {
AeshCorePlugin.log(new RuntimeException("Incorrect SGR instruction: " + arguments));
}
}
private void handleDefault(int sgrCode, AnsiStyleRange styleRange) {
switch(sgrCode) {
case 0 : styleRange.resetToNormal(); break;
case 1 : styleRange.setBoldOn(); break;
case 2 : styleRange.setFaintOn(); break;
case 3 : styleRange.setItalicOn(); break;
case 4 : styleRange.setUnderlineSingle(); break;
case 7 : styleRange.setImageNegative(); break;
case 9 : styleRange.setCrossedOut(); break;
case 22 : styleRange.setBoldOrFaintOff(); break;
case 23 : styleRange.setItalicOff(); break;
case 24 : styleRange.setUnderlineNone(); break;
case 27 : styleRange.setImagePositive(); break;
case 29 : styleRange.setNotCrossedOut(); break;
case 30 : styleRange.setForegroundBlack(); break;
case 31 : styleRange.setForegroundRed(); break;
case 32 : styleRange.setForegroundGreen(); break;
case 33 : styleRange.setForegroundYellow(); break;
case 34 : styleRange.setForegroundBlue(); break;
case 35 : styleRange.setForegroundMagenta(); break;
case 36 : styleRange.setForegroundCyan(); break;
case 37 : styleRange.setForegroundWhite(); break;
case 39 : styleRange.setForegroundDefault(); break;
case 40 : styleRange.setBackgroundBlack(); break;
case 41 : styleRange.setBackgroundRed(); break;
case 42 : styleRange.setBackgroundGreen(); break;
case 43 : styleRange.setBackgroundYellow();break;
case 44 : styleRange.setBackgroundBlue(); break;
case 45 : styleRange.setBackgroundMagenta(); break;
case 46 : styleRange.setBackgroundCyan(); break;
case 47 : styleRange.setBackgroundWhite(); break;
case 49 : styleRange.setBackgroundDefault(); break;
default : throw new RuntimeException("Unknown SGR code: " + sgrCode);
}
}
}