From c8b36d3491bb2c5a3eb0632a2e1ead7d5ea9f7c8 Mon Sep 17 00:00:00 2001 From: J08nY Date: Mon, 2 Jul 2018 16:55:37 +0200 Subject: Add support for colored output. --- src/cz/crcs/ectester/common/cli/CLITools.java | 4 +- src/cz/crcs/ectester/common/cli/Colors.java | 93 +++++++++++++++++++++++++ src/cz/crcs/ectester/common/ec/EC_Category.java | 12 ++-- 3 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 src/cz/crcs/ectester/common/cli/Colors.java (limited to 'src/cz/crcs/ectester/common') diff --git a/src/cz/crcs/ectester/common/cli/CLITools.java b/src/cz/crcs/ectester/common/cli/CLITools.java index 4aa58b0..a9d036e 100644 --- a/src/cz/crcs/ectester/common/cli/CLITools.java +++ b/src/cz/crcs/ectester/common/cli/CLITools.java @@ -22,7 +22,7 @@ public class CLITools { public static void help(String prog, String header, Options options, String footer, boolean usage) { HelpFormatter help = new HelpFormatter(); help.setOptionComparator(null); - help.printHelp(prog, header, options, footer, usage); + help.printHelp(Colors.bold(prog), header, options, footer, usage); } private static void help(HelpFormatter help, PrintWriter pw, CommandLineParser cli, Options opts, int depth) { @@ -97,7 +97,7 @@ public class CLITools { StringWriter uw = new StringWriter(); PrintWriter upw = new PrintWriter(uw); usage(help, upw, baseParser, baseOpts); - pw.print("usage: " + prog); + pw.print("usage: " + Colors.bold(prog)); help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, uw.toString()); upw.close(); pw.println(); diff --git a/src/cz/crcs/ectester/common/cli/Colors.java b/src/cz/crcs/ectester/common/cli/Colors.java new file mode 100644 index 0000000..cdc42e8 --- /dev/null +++ b/src/cz/crcs/ectester/common/cli/Colors.java @@ -0,0 +1,93 @@ +package cz.crcs.ectester.common.cli; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @author Diogo Nunes + * @author Jan Jancar johny@neuromancer.sk + * Adapted from https://github.com/dialex/JCDP/ + */ +public class Colors { + public static boolean enabled = false; + + public interface ANSIParam { + } + + public enum Foreground implements ANSIParam { + BLACK("30"), RED("31"), GREEN("32"), YELLOW("33"), BLUE("34"), MAGENTA("35"), CYAN("36"), WHITE("37"), NONE(""); + private final String code; + + Foreground(String code) { + this.code = code; + } + + @Override + public String toString() { + return code; + } + } + + public enum Background implements ANSIParam { + BLACK("40"), RED("41"), GREEN("42"), YELLOW("43"), BLUE("44"), MAGENTA("45"), CYAN("46"), WHITE("47"), NONE(""); + private final String code; + + Background(String code) { + this.code = code; + } + + @Override + public String toString() { + return code; + } + } + + public enum Attribute implements ANSIParam { + CLEAR("0"), BOLD("1"), LIGHT("1"), DARK("2"), UNDERLINE("4"), REVERSE("7"), HIDDEN("8"), NONE(""); + private final String code; + + Attribute(String code) { + this.code = code; + } + + @Override + public String toString() { + return code; + } + } + + private static final String PREFIX = "\033["; + private static final String SEPARATOR = ";"; + private static final String POSTFIX = "m"; + + public static String colored(String text, ANSIParam... params) { + if (!enabled) { + return text; + } + Optional fg = Arrays.stream(params).filter(Foreground.class::isInstance).map(Foreground.class::cast).findFirst(); + Optional bg = Arrays.stream(params).filter(Background.class::isInstance).map(Background.class::cast).findFirst(); + List attr = Arrays.stream(params).filter(Attribute.class::isInstance).distinct().map(Attribute.class::cast).collect(Collectors.toList()); + + List apply = new LinkedList<>(); + apply.addAll(attr); + fg.ifPresent(apply::add); + bg.ifPresent(apply::add); + List codes = apply.stream().map(Object::toString).collect(Collectors.toList()); + return PREFIX + String.join(SEPARATOR, codes) + POSTFIX + text + PREFIX + Attribute.CLEAR + POSTFIX; + } + + public static String error(String text) { + return colored(text, Foreground.RED, Attribute.BOLD); + } + + public static String ok(String text) { + return colored(text, Foreground.GREEN, Attribute.BOLD); + } + + public static String bold(String text) { + return colored(text, Attribute.BOLD); + } +} \ No newline at end of file diff --git a/src/cz/crcs/ectester/common/ec/EC_Category.java b/src/cz/crcs/ectester/common/ec/EC_Category.java index 32a788d..9c65f3b 100644 --- a/src/cz/crcs/ectester/common/ec/EC_Category.java +++ b/src/cz/crcs/ectester/common/ec/EC_Category.java @@ -1,5 +1,7 @@ package cz.crcs.ectester.common.ec; +import cz.crcs.ectester.common.cli.Colors; + import java.util.Collections; import java.util.Map; import java.util.Objects; @@ -72,13 +74,13 @@ public class EC_Category { @Override public String toString() { StringBuilder out = new StringBuilder(); - out.append("\t- ").append(name).append((desc == null || desc.equals("")) ? "" : ": " + desc); + out.append("\t- ").append(Colors.bold(name)).append((desc == null || desc.equals("")) ? "" : ": " + desc); out.append(System.lineSeparator()); Map curves = getObjects(EC_Curve.class); int size = curves.size(); if (size > 0) { - out.append("\t\tCurves: "); + out.append(Colors.bold("\t\tCurves: ")); for (Map.Entry curve : curves.entrySet()) { out.append(curve.getKey()); size--; @@ -91,7 +93,7 @@ public class EC_Category { Map keys = getObjects(EC_Key.class); size = keys.size(); if (size > 0) { - out.append("\t\tKeys: "); + out.append(Colors.bold("\t\tKeys: ")); for (Map.Entry key : keys.entrySet()) { out.append(key.getKey()); size--; @@ -104,7 +106,7 @@ public class EC_Category { Map keypairs = getObjects(EC_Keypair.class); size = keypairs.size(); if (size > 0) { - out.append("\t\tKeypairs: "); + out.append(Colors.bold("\t\tKeypairs: ")); for (Map.Entry key : keypairs.entrySet()) { out.append(key.getKey()); size--; @@ -117,7 +119,7 @@ public class EC_Category { Map results = getObjects(EC_KAResult.class); size = results.size(); if (size > 0) { - out.append("\t\tResults: "); + out.append(Colors.bold("\t\tResults: ")); for (Map.Entry result : results.entrySet()) { out.append(result.getKey()); size--; -- cgit v1.2.3-70-g09d2