Skip to content

Commit 0cd0dee

Browse files
author
Ciobanu, Andrei-Nicolin (UK - EDC)
committed
Renamed to AnsiScape
1 parent b284f30 commit 0cd0dee

25 files changed

+360
-305
lines changed

build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
group 'net.andreinc.asciiscape'
1+
group 'net.andreinc.ansiscape'
22
version '1.0-SNAPSHOT'
33

44
apply plugin: 'java'
@@ -10,6 +10,7 @@ repositories {
1010
}
1111

1212
dependencies {
13+
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.6'
14+
compileOnly 'org.projectlombok:lombok:1.16.18'
1315
testCompile group: 'junit', name: 'junit', version: '4.12'
14-
compile group: 'org.fusesource.jansi', name: 'jansi', version: '1.16'
1516
}

examples/Example1Simple.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import net.andreinc.asciiscape.AsciiScape;
1+
import net.andreinc.ansiscape.AnsiScape;
22

33
public class Example1Simple {
44
public static void main(String[] args) {
5-
AsciiScape asciiScape = new AsciiScape();
5+
AnsiScape asciiScape = new AnsiScape();
66

77
String formatted = asciiScape.format("{b Some Bold Text {u Also Underlined}}");
88
String formatted2 = asciiScape.format("Romanian Flag {redBg }{yellowBg }{blueBg }");

examples/Example2Simple.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import net.andreinc.asciiscape.AsciiClass;
2-
import net.andreinc.asciiscape.AsciiScape;
3-
import net.andreinc.asciiscape.AsciiScapeContext;
4-
import net.andreinc.asciiscape.AsciiSequence;
1+
import net.andreinc.ansiscape.AnsiClass;
2+
import net.andreinc.ansiscape.AnsiScape;
3+
import net.andreinc.ansiscape.AnsiScapeContext;
4+
import net.andreinc.ansiscape.AnsiSequence;
55

66
public class Example2Simple {
77
public static void main(String[] args) {
8-
AsciiScapeContext context = new AsciiScapeContext();
8+
AnsiScapeContext context = new AnsiScapeContext();
99

10-
AsciiClass title = AsciiClass.withName("title").add(AsciiSequence.BOLD);
11-
AsciiClass url = AsciiClass.withName("url").add(AsciiSequence.UNDERLINE, AsciiSequence.BLUE);
12-
AsciiClass text = AsciiClass.withName("text").add(AsciiSequence.RED);
10+
AnsiClass title = AnsiClass.withName("title").add(AnsiSequence.BOLD);
11+
AnsiClass url = AnsiClass.withName("url").add(AnsiSequence.UNDERLINE, AnsiSequence.BLUE);
12+
AnsiClass text = AnsiClass.withName("text").add(AnsiSequence.RED);
1313

1414
context.add(title).add(url).add(text);
1515

16-
AsciiScape asciiScape = new AsciiScape(context);
16+
AnsiScape ansiScape = new AnsiScape(context);
1717

18-
String format = asciiScape.format("{title Bold title}\n" +
18+
String format = ansiScape.format("{title Bold title}\n" +
1919
"-{text Some url: {url www.google.com}};\n" +
2020
"-{text Some other url: {url {redBg www.redbackground.com}}}");
2121

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
rootProject.name = 'asciiscape'
1+
rootProject.name = 'ansiscape'
22

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package net.andreinc.ansiscape;
2+
3+
import lombok.Getter;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import static java.util.stream.Collectors.joining;
9+
import static org.apache.commons.lang3.StringUtils.isAlphanumeric;
10+
import static org.apache.commons.lang3.StringUtils.isEmpty;
11+
12+
public class AnsiClass {
13+
14+
@Getter private final String name;
15+
private final List<AnsiSequence> ansiSequences = new ArrayList<>();
16+
17+
private AnsiClass(String name) {
18+
this.name = name;
19+
}
20+
21+
public static final AnsiClass withName(String name) {
22+
if (isEmpty(name) || !isAlphanumeric(name)) {
23+
String errFmt =
24+
String.format("Invalid class name: '%s'. The name should be alphanumeric and non-empty.", name);
25+
throw new IllegalArgumentException(errFmt);
26+
}
27+
return new AnsiClass(name);
28+
}
29+
30+
public AnsiClass add(AnsiSequence... sequences) {
31+
for (AnsiSequence seq : sequences) {
32+
ansiSequences.add(seq);
33+
}
34+
return this;
35+
}
36+
37+
public AnsiClass add(String escape) {
38+
if (isEmpty(escape)) {
39+
String errFmt =
40+
String.format("Invalid escape sequence: '%s'. This should be non-empty.", escape);
41+
throw new IllegalArgumentException(errFmt);
42+
}
43+
add(new AnsiSequence(escape));
44+
return this;
45+
}
46+
47+
public AnsiClass inherit(AnsiClass ansiClass) {
48+
this.ansiSequences.addAll(ansiClass.ansiSequences);
49+
return this;
50+
}
51+
52+
public String getCharSequences() {
53+
return ansiSequences.stream()
54+
.map(AnsiSequence::getSequence)
55+
.collect(joining(""));
56+
}
57+
58+
@Override
59+
public String toString() {
60+
return "EscapeClass{" +
61+
"name='" + name + '\'' +
62+
", escapeSequences=" + ansiSequences +
63+
'}';
64+
}
65+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.andreinc.ansiscape;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import net.andreinc.ansiscape.parser.Parser;
7+
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class AnsiScape {
11+
12+
public static final AnsiScape ascii = new AnsiScape();
13+
14+
@Getter private AnsiScapeContext context = new AnsiScapeContext();
15+
16+
public String format(String source, Object... args) {
17+
Parser parser = new Parser(context, source);
18+
return String.format(parser.parse(source), args);
19+
}
20+
21+
public static void main(String[] args) {
22+
System.out.println("\u2554\u2550\u2550\u2557");
23+
System.out.println("\u2551aa\u2551");
24+
System.out.println("\u255A\u2550\u2550\u255D");
25+
}
26+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package net.andreinc.ansiscape;
2+
3+
import java.util.Collections;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
import static net.andreinc.ansiscape.AnsiScapeContextException.asciiClassAlreadyDefined;
9+
import static net.andreinc.ansiscape.AnsiSequence.*;
10+
11+
public class AnsiScapeContext {
12+
13+
private final Map<String, AnsiClass> registeredClasses = new HashMap<>();
14+
15+
public AnsiScapeContext() {
16+
initDefaultClasses();
17+
}
18+
19+
private void initDefaultClasses() {
20+
registeredClasses.put("b", AnsiClass.withName("b").add(BOLD));
21+
registeredClasses.put("bold", AnsiClass.withName("b").add(BOLD));
22+
registeredClasses.put("dim", AnsiClass.withName("dim").add(DIM));
23+
registeredClasses.put("u", AnsiClass.withName("u").add(UNDERLINE));
24+
registeredClasses.put("underline", AnsiClass.withName("underline").add(UNDERLINE));
25+
registeredClasses.put("blink", AnsiClass.withName("blink").add(BLINK));
26+
registeredClasses.put("reverse", AnsiClass.withName("reverse").add(REVERSE));
27+
registeredClasses.put("blank", AnsiClass.withName("blank").add(BLANK));
28+
registeredClasses.put("overstrike", AnsiClass.withName("overstrike").add(OVERSTRIKE));
29+
registeredClasses.put("reset", AnsiClass.withName("reset").add(RESET));
30+
registeredClasses.put("black", AnsiClass.withName("black").add(BLACK));
31+
registeredClasses.put("blackBg", AnsiClass.withName("blackBg").add(BLACK_BG));
32+
registeredClasses.put("red", AnsiClass.withName("red").add(RED));
33+
registeredClasses.put("redBg", AnsiClass.withName("redBg").add(RED_BG));
34+
registeredClasses.put("green", AnsiClass.withName("green").add(GREEN));
35+
registeredClasses.put("greenBg", AnsiClass.withName("greenBg").add(GREEN_BG));
36+
registeredClasses.put("yellow", AnsiClass.withName("yellow").add(YELLOW));
37+
registeredClasses.put("yellowBg", AnsiClass.withName("yellowBg").add(YELLOW_BG));
38+
registeredClasses.put("blue", AnsiClass.withName("blue").add(BLUE));
39+
registeredClasses.put("blueBg", AnsiClass.withName("blueBg").add(BLUE_BG));
40+
registeredClasses.put("magenta", AnsiClass.withName("magenta").add(MAGENTA));
41+
registeredClasses.put("magentaBg", AnsiClass.withName("blueBg").add(MAGENTA_BG));
42+
registeredClasses.put("cyan", AnsiClass.withName("cyan").add(CYAN));
43+
registeredClasses.put("cyanBg", AnsiClass.withName("cyan").add(CYAN_BG));
44+
registeredClasses.put("white", AnsiClass.withName("white").add(WHITE));
45+
registeredClasses.put("whiteBg", AnsiClass.withName("whiteBg").add(WHITE_BG));
46+
}
47+
48+
public Set<String> getClassNames() {
49+
return Collections.unmodifiableSet(registeredClasses.keySet());
50+
}
51+
52+
public AnsiScapeContext add(AnsiClass ansiClass) {
53+
if (registeredClasses.containsKey(ansiClass.getName())) {
54+
throw asciiClassAlreadyDefined(ansiClass.getName());
55+
}
56+
registeredClasses.put(ansiClass.getName(), ansiClass);
57+
return this;
58+
}
59+
60+
public AnsiClass get(String className) {
61+
return registeredClasses.get(className);
62+
}
63+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package net.andreinc.ansiscape;
2+
3+
public class AnsiScapeContextException extends RuntimeException {
4+
5+
public static final AnsiScapeContextException asciiClassAlreadyDefined(String className) {
6+
return new AnsiScapeContextException(String.format("The '%s' already exists in the context. Please choose another name.", className));
7+
}
8+
9+
public AnsiScapeContextException(String msg) {
10+
super(msg);
11+
}
12+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package net.andreinc.ansiscape;
2+
3+
import lombok.Getter;
4+
5+
import static org.apache.commons.lang3.StringUtils.isEmpty;
6+
7+
public class AnsiSequence {
8+
9+
private static final String ESCAPE_FORMAT = ((char)27) + "[%sm";
10+
11+
public static final AnsiSequence RESET = new AnsiSequence("0");
12+
public static final AnsiSequence BOLD = new AnsiSequence("1");
13+
public static final AnsiSequence DIM = new AnsiSequence("2");
14+
public static final AnsiSequence UNDERLINE = new AnsiSequence("4");
15+
public static final AnsiSequence BLINK = new AnsiSequence("5");
16+
public static final AnsiSequence REVERSE = new AnsiSequence("7");
17+
public static final AnsiSequence BLANK = new AnsiSequence("8");
18+
public static final AnsiSequence OVERSTRIKE = new AnsiSequence("9");
19+
20+
public static final AnsiSequence BLACK = new AnsiSequence("30");
21+
public static final AnsiSequence BLACK_BG = new AnsiSequence("40");
22+
public static final AnsiSequence RED = new AnsiSequence("31");
23+
public static final AnsiSequence RED_BG = new AnsiSequence("41");
24+
public static final AnsiSequence GREEN = new AnsiSequence("32");
25+
public static final AnsiSequence GREEN_BG = new AnsiSequence("42");
26+
public static final AnsiSequence YELLOW = new AnsiSequence("33");
27+
public static final AnsiSequence YELLOW_BG = new AnsiSequence("43");
28+
public static final AnsiSequence BLUE = new AnsiSequence("34");
29+
public static final AnsiSequence BLUE_BG = new AnsiSequence("44");
30+
public static final AnsiSequence MAGENTA = new AnsiSequence("35");
31+
public static final AnsiSequence MAGENTA_BG = new AnsiSequence("45");
32+
public static final AnsiSequence CYAN = new AnsiSequence("36");
33+
public static final AnsiSequence CYAN_BG = new AnsiSequence("46");
34+
public static final AnsiSequence WHITE = new AnsiSequence("37");
35+
public static final AnsiSequence WHITE_BG = new AnsiSequence("47");
36+
37+
public AnsiSequence(String escape) {
38+
if (isEmpty(escape)) {
39+
String errFmt =
40+
String.format("Invalid escape sequence: '%s'. This should be non-empty.", escape);
41+
throw new IllegalArgumentException(errFmt);
42+
}
43+
this.sequence = String.format(ESCAPE_FORMAT, escape);
44+
}
45+
46+
@Getter private String sequence;
47+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package net.andreinc.ansiscape.boxes;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
@Builder
8+
@AllArgsConstructor
9+
public class AsciiBoxType {
10+
// public static final AsciiBoxType STANDARD = new AsciiBoxType("\u250C", "\u2510", )
11+
@Getter private String upperLeftCorner;
12+
@Getter private String upperRightCorner;
13+
@Getter private String horizontal;
14+
@Getter private String vertical;
15+
@Getter private String bottomLeftCorner;
16+
@Getter private String bottomRightCorner;
17+
}

0 commit comments

Comments
 (0)